展示数据
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直接就帮我们创建好了一切,什么都不用动,开始动手写吧
创建步骤
- 创建一个类,继承自UITableViewController
- 什么都不需要设置,不需要设置什么代理和数据源之类的,IOS已经都设置好了
- 删掉没用的,留下有用的,实现需要的,比如cell需要我们自己实现
- 创建一个控制器,绑定到我们刚创建的控制器类
- 然后随便写一写就可以用了
//只需要写一下这个,其他都不用管,直接就可以用了,动手试试吧
- (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;
}
这个东西感觉还是蛮不错的。
网友评论