1. 程式人生 > >iOS基礎:UITableView簡單使用

iOS基礎:UITableView簡單使用

一、UITableView的建立
//tableView初始化用此方法
-(instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style;

self.tableV.editing = !self.tableV.editing;//是否允許編輯
self.tableV.allowsMultipleSelectionDuringEditing = !self.tableV.allowsMultipleSelectionDuringEditing;//是否允許多選
//給tableView設定背景View
self.tableV.backgroundView = [[UIImageView alloc]initWithImage:[self getImageFromMainImagesDirectoryWithImageName:@"nonews"]];
self.tableV.backgroundView.contentMode = UIViewContentModeCenter;

//設定tableView是否可以滾動
 self.tableV.scrollEnabled = NO;


二、UITableView的代理方法

//幾個區
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}
//每個區內幾個cell
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    
    return 1;
}
//cell的預估高度
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    return 44.0f;
}
//cell的實際高度
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    //返回UITableViewAutomaticDimension時cell的高度是自適應高度
    //需要與預估高度配合使用
    return UITableViewAutomaticDimension;
}

//cell的具體設定
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString * ID = @"cell";
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:ID];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:0 reuseIdentifier:ID];
    }
    return cell;
}

//選中 在多選狀態下選中也會呼叫
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    if (self.tableV.editing) {
        [self.selectArr addObject:indexPath];
    }  
}

//反選 在多選狀態下反選也會呼叫
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
    if (!self.tableV.editing) {
        [self.selectArr removeObject:indexPath];
    }
    
}

//長按向左滑動cell
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"長按向左滑動");
    return UITableViewCellEditingStyleDelete;
}
//點選刪除或減號或加號時會呼叫這個方法
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"點選刪除按鈕");
    [self.dataArr removeObjectAtIndex:indexPath.row];
    [self.tableV reloadData];
}

//拖動cell完成的時候會呼叫
-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
    
NSLog(@"源:%@  目標%@ ",sourceIndexPath,destinationIndexPath);
#if 0
    if( sourceIndexPath.row<destinationIndexPath.row){
    [self.dataArr insertObject:self.dataArr[sourceIndexPath.row] atIndex:destinationIndexPath.row+1];
    [self.dataArr removeObjectAtIndex:sourceIndexPath.row];
       
    }
    else{
        
        [self.dataArr insertObject:self.dataArr[sourceIndexPath.row] atIndex:destinationIndexPath.row];
        [self.dataArr removeObjectAtIndex:sourceIndexPath.row+1];
        
    }
#elif 1
    id x = self.dataArr[sourceIndexPath.row];
    [self.dataArr removeObject:x];
    [self.dataArr insertObject:x atIndex:destinationIndexPath.row];
    //[self.dataArr exchangeObjectAtIndex:sourceIndexPath.row withObjectAtIndex:destinationIndexPath.row];   
#endif
    [self.tableV reloadData];
}

三、其它重要方法

1.cell的提前註冊

//註冊cell
[self.tabelView registerClass:[MYCell class] forCellReuseIdentifier:@"id"];
//註冊cell 有xib檔案的cell
    [self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"id"];
//建立cell 顯示內容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
#if 0
    //1.設定重用識別符號
    static NSString *cellID = @"id";
    
    //2.依據重用識別符號 從重用池裡面獲取cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    
    //3.判斷cell是否存在
    if (!cell) {
        //4.如果不存在 建立cell
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
        
        //如果使用系統的UITableViewCell 在cell上新增子控制元件的時候 需要在這個判斷裡建立、新增
        UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(100, 40, 100, 40)];
        label.backgroundColor = [UIColor redColor];
        //在cell上新增子控制元件 需要新增到cell得contentView上
        [cell.contentView addSubview:label];
        label.tag = 100;
    }
    //4.讓cell顯示資料
    cell.textLabel.text = @"資料";
    
    //cell上子控制元件顯示資料一定要在判斷外
    UILabel *subLabel = (id)[cell viewWithTag:100];
    subLabel.text = @"顯示資料";
    
    //5.返回cell
    return cell;
#elif 0
    
    static NSString *cellID = @"id";
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    if (!cell) {
        //NSBundle 統一管理程式資源的類
        cell = [[[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil] lastObject];
    }
    
    cell.titleLabel.text = @"標題";
    cell.nameField.text = @"名字";
    return cell;
#else
    //由於提前註冊了這個cell 需要使用下面這個方法
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"id" forIndexPath:indexPath];
    
    return cell;
#endif
}

2.cell的建立
#pragma mark--建立cell的時候呼叫
//cell的初始化用initWithStyle而不是initwithframe
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        
        [self setUpAllChildView];
    }
    return self;
}

3.獲取固定的cell
//獲取某個固定的cell
UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

4.設定cell的分割線

 cell.separatorInset= UIEdgeInsetsMake(20, 50, 20, 50);

//設定cell的顏色

self.tabelView.separatorColor = [UIColor red];

4.自動使用導航條

//是否自動適應導航條與標籤條
    self.automaticallyAdjustsScrollViewInsets = YES;
5.表頭、表尾、內邊距、偏移量
    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
    self.tableView.contentOffset = CGPointMake(0, 0);
    self.tableView.tableHeaderView = headerView;
    self.tableView.tableFooterView = footerView;

6.重新整理
//重新整理某一行
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];
//具體某些分割槽重新整理過載
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:(view.tag - 100)] withRowAnimation:UITableViewRowAnimationFade];

//重新整理所有
[self.tableView reloadData];

7.選中狀態

//去掉選中的狀態
[self deselectRowAtIndexPath:indexPath animated:YES];