iOS開發-UI (八)TableView

知識點:數組

1.UITableView使用app

2.UITableView分段功能ide

3.UITableViewCell重用機制優化

 

=======================動畫

UITableView使用atom

    1.UITableView做用spa

    2.UITableView建立代理

    - (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style;code

UITableViewStyle:orm

UITableViewStylePlain       列表模式

    UITableViewStyleGrouped       分組模式

// 實例化一個表格視圖

    //UITableViewStylePlain 列表模式

    //UITableViewStyleGrouped 分組模式

    

UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped];

    //設置代理

    tableView.delegate = self;

    tableView.dataSource = self;

    [self.view addSubview:tableView];

 

 

    3.UITableView關聯數據(上面)

      1)tableView經過代理關聯數據

   

    4.NSIndexPath

      主要用來標識當前cell的在tableView中的位置

      該對象有section和row兩個屬性,

      前者標識當前cell處於第幾個section中

      後者表明在該section中的第幾行

 

    5.UITableViewCell介紹

      1)建立方式

       - (id)initWithStyle:(UITableViewCellStyle)style 

  reuseIdentifier:(NSString *)reuseIdentifier

//當某一個視圖控制器受到導航控制器管理的時候,若是在self.view之上添加的第一個子視圖是UIScrollView或者UIScrollView的子類,那麼這個對象的座標會自動往下偏移64個單位

    //關閉此優化機制

    //self.automaticallyAdjustsScrollViewInsets = NO;

UITableViewCellStyle:

UITableViewCellStyleDefault

UITableViewCellStyleValue1

UITableViewCellStyleValue2

UITableViewCellStyleSubtitle

 

   UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

=======================

UITableView分段功能

   1.設置tableView的樣式

     UITableViewStyleGrouped

   2.設置代理

     1)設置段數:默認返回1

     - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

=======================

UITableView經常使用方法

UITableViewDataSource 

UITableViewDelegate

@interface RootViewController ()<UITableViewDelegate,UITableViewDataSource>

 #pragma mark- UITableViewDelegate&UITableViewDataSource

//返回組數 (可選實現)

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

        return 2;

}

 

//返回一組裏面有幾行(默認爲1組)

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

   

    return 20;

}

//每一行都須要返回一個UITableViewCell類型的對象

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    //NSIndexPath 表格視圖中的座標對象

    // section->組

    // row->行

    

    

    //建立UITableViewCell類型的對象

    /*

     參數1:cell的類型

     參數2:複用標識

     */

    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

    

    //設置cell的標題爲

    cell.textLabel.text = @"你們好";

    //設置圖片

    cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%03ld", indexPath.section * 20 + indexPath.row + 1]];

    

    return cell;

    

}

  1)設置行高

  - (CGFloat)tableView:(UITableView *)tableView 

       heightForRowAtIndexPath:(NSIndexPath *)indexPath

//設置行高

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 100;
}

 

2)設置段頭標題

  - (NSString *)tableView:(UITableView *)tableView 

  titleForHeaderInSection:(NSInteger)section

//返回組頭標題

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    return [NSString stringWithFormat:@"第%ld組組頭",section];
}

 

3)設置段尾標題

  - (NSString *)tableView:(UITableView *)tableView 

  titleForFooterInSection:(NSInteger)section

//返回組尾標題

-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{

    return @"我是組尾";

}

 

4)刪除/插入一行(兩個一塊兒用)

//編輯事件的回調方法

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{

    if (editingStyle == UITableViewCellEditingStyleDelete) {

        //刪除

        //首先刪除數據源

        [self.dataArr removeObjectAtIndex:indexPath.row];

        //刷新UI

        //reloadData 從新加載一遍數據

        //[_tableView reloadData];

        //帶動畫刷新(刪除)

        [_tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];

    }else{

        //插入
        //首先在數據源當中插入新數據

        [self.dataArr insertObject:@"西安" atIndex:indexPath.row];

        //刷新UI

        //[_tableView reloadData];

        //帶動畫刷新(插入)

        [_tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];
    }
}

//返回的編輯類型

-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{

    /*

     UITableViewCellEditingStyleDelete //刪除

     UITableViewCellEditingStyleInsert  //插入

 

     */

    //return UITableViewCellEditingStyleDelete;

    return UITableViewCellEditingStyleInsert;

}

 

 

5)定製刪除上面的文字

  - (NSString *)tableView:(UITableView *)tableView  titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath

 

//tableView調用

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths 

      withRowAnimation:(UITableViewRowAnimation)animation;

- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths 

              withRowAnimation:(UITableViewRowAnimation)animation;

 

6)進入編輯和取消編輯模式

  @property(nonatomic,getter=isEditing) BOOL editing

 

7)如何讓指定行能夠編輯

  - (BOOL)tableView:(UITableView *)tableView 

      canEditRowAtIndexPath:(NSIndexPath *)indexPath

  

 //是否容許編輯

-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{

    //第一行不容許編輯例子

    /*

    if (indexPath.row == 0) {

        return NO;

    }

     */
    return YES;
}

 

8)如何作索引

  - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView

  //返回索引

-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{

    NSMutableArray *newArr = [NSMutableArray new];

    //注意:索引的數量應該跟組數相等,若是索引的數量大於組數,則剩餘的索引將無效

    for (char i  = 'A'; i <= 'Z'; i++) {

        [newArr addObject:[NSString stringWithFormat:@"%c組",i]];
    }
    return newArr;

}

 

9)如何跳轉到指定某一段某一行

  - (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath 

        atScrollPosition:(UITableViewScrollPosition)scrollPosition 

        animated:(BOOL)animated;

 

10)如何移動一行  

  - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)

sourceIndexPath toIndexPath: (NSIndexPath *)destinationIndexPath{

//移動某一行

-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{

    //sourceIndexPath 初始行數

    //destinationIndexPath 目標行數

  //保存一份

    id obj = self.dataArr[sourceIndexPath.row];
    //刪除

    [self.dataArr removeObjectAtIndex:sourceIndexPath.row];

    //插入到目標位置
    [self.dataArr insertObject:obj atIndex:destinationIndexPath.row];

    for (NSString *str in self.dataArr) {

        NSLog(@"str = %@",str);
    }
}

 

11)選中指定行

  - (void)tableView:(UITableView *)tableView 

    didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

//選中某一行

//didSelectRowAtIndexPath   正確

//didDeselectRowAtIndexPath 錯誤

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    NSLog(@"選中的行數爲%ld",indexPath.row);

    /*

     UITableViewScrollPositionTop 移動某一行到屏幕的頂部

     UITableViewScrollPositionMiddle 移動某一行到屏幕的中間

     UITableViewScrollPositionBottom 移動某一行到屏幕的底部

     */

    [tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}

 

12)處理accessoryButton按下的事件

  - (void)tableView:(UITableView *)tableView

accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath

 

=======================

UITableViewCell複用機制

   

    1.cell重用方式

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; 

    2.複用的問題

第一次dequeue的時候可能還不存在該cell,因此須要判斷

若是隊列中沒有該cell的話,則須要alloc一個

#pragma mark- UITableViewDelegate&UITableViewDataSource

//返回一組裏面有幾行(默認爲1組)

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    return 20;

}

//每一行都須要返回一個UITableViewCell類型的對象

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{


    //在每個UITableView當中,都會擁有一個複用隊列(數組),每當須要返回一個UITableViewCell類型的對象的時候,首先去複用隊列裏面查找是否擁有相同類型的對象,若是有,就拿出來再次使用

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    //若是複用隊列當中沒有找到,就建立新對象

    if (cell == nil) {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];

    }
    NSLog(@"修改前顯示的內容爲%@",cell.textLabel.text);

    //設置cell的標題爲

    cell.textLabel.text = [NSString stringWithFormat:@"%ld行",indexPath.row + 1];
    NSLog(@"修改後顯示的內容爲%@",cell.textLabel.text);
    return cell;

}
相關文章
相關標籤/搜索