1.UITableViewController
特点:
1>继承自UIViewController
2>天生自带了一个表视图对象(.tableView属性读取)
3>控制器已经成为了表视图的数据源代理和delegate代理
4>UITableViewController已经遵守了UITableViewDataSource和UITableViewDelegate协议所以,如果想显示表格数据的话,只需要创建一个类,继承自UITableViewController,然后 只需要关注 三问一答 即可,无需再去进行创建表视图 设置代理 遵守协议这些操作了
2. 单元格的重用
理念: 因为系统已经具备了一个能力——自动将那些已经完整的滚动超出屏幕后不需要显示的cell,存到tableView的一个队列中,所以每当需要单元格填充屏幕时,我们可以先尝试着去队列中取,看是否能取到重用的单元格,如果取到了,修改数据,返回,重新出现在界面上,如果,取不到,再新建
方式一:理念 —— 取不到时,自己创建cell实例
方式二:理念 —— 提早跟系统注册cell,然后,放心大胆的去队列取单元格即可,如果取不到,则系统会自动根据提早注册的cell的样式,为我们自动新建一个cell
注意:使用的是tableView的dequeueReusableCellWithIdentifier: forIndexPath:
3.UITableViewCell 单元格
3.1 UITableViewCell组成
第一部分: 内容视图 contentView
第二部分: 辅助视图 accessoryView
//因为cell一定得显示内容,所以contentView很重要.系统会自动已经创建出contentView实例,所以,可以直接向contentView中添加子视图,如果没创建,就以赋值形式添加
//对于辅助视图accessoryView来说因为没有那么重要,所以系统不会自动将accessoryView创建出实例对象,所以不能直接往这个nil中addSubView
cell.accessoryView = mySwitch;//自定义辅助视图【开关作辅助视图】
3.2 内容视图
通过cell 的contentView访问的到
1>可以使用系统提供好得样式直接设置显示内容
为UITableViewCell准备了三个属性:
textLabel detailTextLabel imageView
可以通过在创建cell时指定cell的样式,来决定三个部分的排布位置
Default样式: 只显示textLabel和imageView,且左右排布
Value1样式:右对齐——三部分都显示,detailTextLabel在右侧
Value2样式:左对齐——图片不显示,detailTextLabel在左侧
SubTitle样式: 三部分都显示,detailTextLabel在textLabel下方显示
2>直接向contentView中添加自定义的内容样式设置
为了避免重用单元格时,重复的添加子视图,所以,为子视图设定tag值后,再添加到cell中,然后,每次尝试着从cell中先按照tag值取子视图,如果不能取到子视图,再新建添加,如果取得到,那么就直接修改这个子视图中显示的内容即可
subView.tag = 1; 设置子视图的tag值
[view viewWithTag:1] 取子视图
3.3 辅助视图
a>系统版
cell.accessoryType = 四种类型
大于号 DisclosureIndicator
对勾 checkMark
圆圈i detailButton
圆圈i+大于号 detailDisclosureButton…
b>自定义版
cell.accessoryView = 自己创建的视图对象
缓冲,缓存的单元格是有多种不同类型(样式)的
[NSBundele mainbundle]获取一个对象
沙格文件
辅助视图,不仅有外观还可以有子视图
名字一方面显示作用,一方面显示内容
为每一个添加进去的子视图起一个标识,tag:旗帜,标志,标签。
tag值可以(只能)设置整数,不要写零,1往上。同一个容器中的子视图的标签是绝对不可以重复的(这里每个标签都在各自的单元格里,所以可以都1)
子类类型的引用是不能指向父类的,但父类类型的引用是可以指向任意一个子类类型的对象。
4.更新表格刷新显示数据
[tableView reloadData];
单元格重用方式一
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {//每行内容是什么?
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];//先尝试着去队列中按照标识符取cell
if (cell == nil) {//如果没取到,再新建
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}
cell.textLabel.text = [NSString stringWithFormat:@"%ld:Hello",indexPath.row+1];
return cell;
}
单元格重用_方式二(取不到单元格,系统帮我们建)
1.注册 [加载函数中提早跟系统注册单元格,只有在队列中取不到单元格时,系统会自动根据提早注册的cell样式(单元格类的描述和名字)为我们自动新建一个cell]
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:
@"MyCell"];
2.在创建单元格的第三问(每行内容是什么?)中
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell" forIndexPath:indexPath];//这句执行完cell中一定有对象了,不用去管这个对象是系统新建还是dequeue的
cell.textLabel.text = @"Hello";