表视图UITableView,iOS中最重要的刷图
表视图通常用来管理一组具有相同数据结构的数据
UITableView继承自UIScrollView,所以它也是可以滚动的
表视图可以分区显示数据,每个分区称为一个section,每一行称为row,编号都是从0开始的
初始化:
UITableView *tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:(UITableViewStylePlain)
后面的style一共2种,另一种是group,每个分区有一定的间隙,Plain则没有
UITableView需要遵守两个代理协议,一个是UITableViewDelegate,另一个是UITableViewDataSource
所以需要设置这两个的代理人
设置整个tableView的表头和表尾 表头表尾设置的view只有高度会对其有所影响,因为他的起始点是默认的,width也是默认整个屏幕的宽
表头的属性: tableView.tableHeaderView
表尾的属性: tableView.tableFooterView
上面提到了遵守UITableViewDataSource协议,这个协议有两个必须要实现的方法:
第一个是返回每个分区的行数 返回值是NSInteger
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
第二是返回索引处(分别为哪一个分区的哪一行)的每一个cell,返回值是 UITableViewCell
- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
其中UITableViewCell有两个属性UIlabel,UIImageView 是为了添加文字与图片的
设置cell标题 cell.textLabel.text = @“”;
cell.detailTextLabel.text = @“”;
重用机制(UITableViewCell重用):
需要一个重用的集合 作用: 把滑出屏幕的cell(完全消失在屏幕时)放入这个重用集合(备用)
当屏幕下方需要新的cell进行展示的时候 开始备用
方式是: 首先系统会先去重用集合中找 看有没有cell可以重新使用 如果有就直接使用 如果没有就创建一个新的cell出来进行使用
如果只有一个分区的话,一般系统共初始化屏幕上的cell的个数+1
static NSString *identifier = @"MyCell";
// 去重用集合中按标识符寻找对应的cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (nil == cell) {
// 去创建新的cell
// 释放cell的时候, 只有创建出来的才需要去释放, 从集合中取出来的不用释放了
cell = [[[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleSubtitle) reuseIdentifier:identifier] autorelease];
static int number = 0;
number++;
NSLog(@”%d”,number);
}
// 赋值cell上的控件 (从集合中取出来的也需要重新赋值)
设置辅助按钮, cell.accessoryType = UITableViewCellAccessoryCheckmark;
其他方法:
设置分区表头表尾标题 返回值是NSString
设置分区表头表尾高度 返回值是CGFloat
设置tableView右边标题小按钮 返回值是数组,将数组中的值作为右边的小按钮
设置分区行的高度, 返回值是CGFloat
获取文件内容时
UITableView与model结合起来使用
1. 拿到文件的路径
从目录中获取
NSString *path = [[NSBundle mainBundle] pathForResource:@”TableViewPlist” ofType:@”plist”]; 一个是文件名,一个后缀(没有.)
创建一个字典,接收文件中的内容
NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:path];
2.新建一个cellModel, 字典中有几个键值对 就要创建几个属性
注意:属性的名字 就是键值对中的key 要完全一致
3.把value中的字典 转化为数据模型
创建装完model的字典
self.dataDic = [NSMutableDictionary dictionary];
// 遍历字典
NSArray *keys = dic.allKeys;
for (int i = 0; i < keys.count; i++) {
// 取出每一个key
NSString *key = keys[i];
// 用每一个key取出 对应的value
NSArray *value = dic[key];
// 创建临时数组 保存每一个赋值完成的model
NSMutableArray *tempArray = [NSMutableArray array];
// 遍历每一个value
for (NSDictionary *oneDic in value) {
// 给model赋值了
// 创建model
CellModel *model = [[CellModel alloc]init];
// KVC
// 你给我一个字典 我还你一个赋值完成的model
[model setValuesForKeysWithDictionary:oneDic];
// 把model装进临时数组中
[tempArray addObject:model];
// 释放
[model release];
}
// 重新构建字典的键值对
[ self.dataDic setObject:tempArray forKey:key];
}
重点: 这样文件里面的东西就转换成一个字典,key是字符串,value是数组,数组里面是mode, 底下在给cell添加标题等 就可以在通过model里面的属性就行赋值
点击cell跳转的方法:
- (void)tableView:(UITableView )tableView didSelectRowAtIndexPath:(NSIndexPath )indexPath