美文网首页iOS-UIiOS学习程序员
UITableView学习总结1:基本用法

UITableView学习总结1:基本用法

作者: 世外大帝 | 来源:发表于2017-01-01 20:02 被阅读65次
UITableView学习总结

展示数据

UITableView是IOS开发中用的最多的组件之一,相当于Android的ListView,用来展示大量的列表数据。

UITableView的特点

UITableView需要一个数据源来展示数据,系统会提供这个数据源方法:dataSource

  • UITableView的会请求数据源,得到数据,如多少行,每行显示什么
  • 没有dataSource,UITableView球都不是
  • 凡是遵守UITableViewDataSource协议的OC对象,都可以是UITableView的数据源

两种样式

UITableView可以展示两种样式
,你只需要改变它的Style即可。

  • Style
    • Plain
    • Grouped

而在Android中,需要用ListView和ExpandableListView两种控件来完成,前段时间刚做了个Android项目,感觉很蛋疼,如果是IOS就简单多了,也不用写什么适配器。

填充内容

遵守UITableView协议后,必须重写两个方法

Plain

@required

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

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)

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

Grouped

如果是Grouped,得重写3个方法,需要多加一个分组方法,设置有多少组

/**
 * 设置TableView中有多少组数据
 */
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    
    return 2;
}

设置显示内容样式

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

在初始化Cell的时候,系统提供了几种常用的样式:

  • UITableViewCellStyleSubtitle
  • UITableViewCellStyleValue1
  • UITableViewCellStyleValue2
  • UITableViewCellStyleDefault

当然,默认样式可以忽略,直接init就行了- -!


- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    //初始化的时候加载样式
    UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
    //设置第几组
    if(indexPath.section==0){
        //设置第几行
        if(indexPath.row==0){
            //标题
            cell.textLabel.text = @"奥迪";
            //图片
            cell.imageView.image = [UIImage imageNamed:@"img01"];
            //详细信息
            cell.detailTextLabel.text = @"这是一辆奥迪";
        }else if(indexPath.row==1){
            cell.textLabel.text = @"奔驰";
        }else if(indexPath.row==2){
            cell.textLabel.text = @"宝马";
        }
        
    }

设置分组标题

其实就是设置Header和Footer

  • title里面有两个方法
    • Header 在组的头部,可以理解为标题
    • Footer 在组的尾部,可以理解为尾部标题或者描述
/**
 * 设置分组标题
 */
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    return  @"德系车";
}

/**
 * 设置分组描述
 */
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
    return @"大众车,为大众";
}


UITableView显示数据步骤

  • 设置dataSource数据源
  • 数据源要遵守UITableViewDataSource协议
  • 数据源要实现协议中的方法
  • 具体实现

UITableView设置代理

如果是纯粹的显示数据,上面的就足够了,有时候我们需要实现和ListView(列表)差不多的效果,而且需要每个cell都可以点击,那么就需要去实现它的监听方法了。

  • 首先,需要设置代理
@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>

- (void)viewDidLoad {
    [super viewDidLoad];
    //设置代理
    self.tableView.delegate = self;
    //注册标识符对应的cell类型
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
}
  • 其次,你需要啥就监听啥吧
  • 话不多说,上代码
//选中事件
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"click-%zd",indexPath.row);
}
//取消事件
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"unclick-%zd",indexPath.row);
}
//行高,比如高度是根据内容决定的时候,可能会用到这个方法
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    if(indexPath.row%2==0){
        return 70;
    }
       return tableView.rowHeight;
}
//Plain下的header and footer
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
   
        return @"header";
}
-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
    return @"footer";
}
//Group下的header and footer,第section组显示什么样的控件
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    return [UIButton buttonWithType:UIButtonTypeContactAdd];
}
-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
    return [UIButton buttonWithType:UIButtonTypeInfoLight];
}
  • IOS提供的东西太特么多了,常用的就上面几个了,有一些奇葩需求的,也可以去delegate里面找一找。

UITableViewController

前面的东西需要自己写很多东西,但是这个UITableViewController直接就帮我们创建好了一切,什么都不用动,开始动手写吧

创建步骤

  1. 创建一个类,继承自UITableViewController
  2. 什么都不需要设置,不需要设置什么代理和数据源之类的,IOS已经都设置好了
  3. 删掉没用的,留下有用的,实现需要的,比如cell需要我们自己实现
  4. 创建一个控制器,绑定到我们刚创建的控制器类
  5. 然后随便写一写就可以用了
//只需要写一下这个,其他都不用管,直接就可以用了,动手试试吧
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    //定义标识符
    static NSString *ID = @"cell";
    //缓存池查找数据
    UITableViewCell*cell = [tableView dequeueReusableCellWithIdentifier:ID];
    //判空,如果没有就根据id初始化
    if(cell == nil){
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }
    //设置数据
    cell.textLabel.text = [NSString stringWithFormat:@"第 %zd 行",indexPath.row];
//    NSLog(@"第 %zd 行",indexPath.row);
    return cell;
}

这个东西感觉还是蛮不错的。

相关文章

网友评论

    本文标题:UITableView学习总结1:基本用法

    本文链接:https://www.haomeiwen.com/subject/scmevttx.html