4、iOS 开发之 UITableView
2015-08-29 03:31
585 查看
一、UITableView的创建
表格控件在创建时必须指定样式,只能使用以下实例化方法[[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped];
UITableView的两种样式
1> UITableViewStylePlain 2> UITableViewStyleGrouped
2.UITableView的常见属性
// 头部视图(广告) @property (nonatomic, retain) UIView *tableHeaderView; // 显示加载的状态 @property (nonatomic, retain) UIView *tableFooterView; // 每行的高度 @property (nonatomic) CGFloat rowHeight; // 组头部高度(QQ好友列表) @property (nonatomic) CGFloat sectionHeaderHeight; // 组尾部高度 @property (nonatomic) CGFloat sectionFooterHeight;
3.常见的方法
// 用于从缓存池中取出可用的cell - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier;
二、UITableView展示数据
UITableView展示数据需要数据源datasource遵守数据源协议 UITableViewDataSource,并实现数据源的方法
1.遵守数据源协议
<UITableViewDataSource>
self.tableView.dataSource = self;
2.实现数据源方法
// 一共有多少组数据 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; // 每一组有多少行数据 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; // 每一行显示什么内容 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; // 每行的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath // 选中某一行的数据 - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath // 组头部标题 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section // 组尾部标题 - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section // 右值索引列表 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView; // 组头部视图 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section; // 组尾部视图 - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section; // 组头高度 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section; // 组尾部高度 - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
三、UITableViewCell的创建
1.cell的常见属性// 图标 @property (nonatomic, readonly, retain) UIImageView *imageView; // 标题 @property (nonatomic, readonly, retain) UILabel *textLabel; // 详细标题 @property (nonatomic, readonly, retain) UILabel *detailTextLabel; // 内容视图,是包含以上3个视图的 @property (nonatomic, readonly, retain) UIView *contentView; // 右边的入口视图 @property (nonatomic, retain) UIView *accessoryView;
2.创建cell的方法
1>
// cell是通过手写代码创建的,才会调用这个方法来初始化cell [[UITableViewCell alloc] initWithStyle:<#(UITableViewCellStyle)#> reuseIdentifier:<#(NSString *)#>];
UITableviewCellStyle属性决定使用contentView的哪些子视图,以及这些子视图的位置
UITableViewCellStyleDefault // 标题+图像 UITableviewCellStyleSubtitle // 标题+明细+图像 UITableViewCellStyleValue1 // 标题+明细+图像 UITableviewCellStyleValue2 // 标题+明细 reuseIdentifier:用于cell循环利用的标示ID
2>
// cell是通过storyboard或则xib实现的,就会调用这个方法来初始化cell - (void)awakeFromNib {}
3>
// 在这方法中设置子控件的frame - (void)layoutSubViews {}
3.Cell重用的原理
1> 当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象
2> 还有一个非常重要的问题:有时候需要自定义UITableViewCell(用一个子类继承UITableViewCell),而且每一行用的不一定是同一种UITableViewCell,所以一个UITableView可能拥有不同类型的UITableViewCell,对象池中也会有很多不同类型的UITableViewCell,那么UITableView在重用UITableViewCell时可能会得到错误类型的UITableViewCell
解决方案:
UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象
4.Cell的重用代码
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 1.定义一个cell的标识 static NSString *ID = @"mjcell"; // 2.从缓存池中取出cell UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; // 3.如果缓存池中没有cell if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; } // 4.设置cell的属性... return cell; }
四、cell的自定义实现
1.xib实现UITableViewCell (cell的高度一致)1> 新建一个xib文件描述一个View的内部结构(假设叫WBTgCell.xib) 2> 新建一个自定义的类,类名和xib文件名保持一致 WBTgCell 3> 将xib中的控件和自定义的.m文件进行连线,并指定可重用的标示符 4> 提供一个类方法返回一个创建好的自定义的view(屏蔽xib的加载过程) 5> 提供一个模型属性接受外界传来的模型数据 6> 重写模型属性的setter方法,在setter方法中将模型数据展示到对应的子控件上
2.通过代码自定义cell(cell的高度不一致)
1> 新建一个继承自UITableviewCell的类 2> 重写initWithStyle:reuseIdentifier:方法 *添加所有需要显示的子控件(不需要设置子控件的数据和frame,子控件要添加到contentView中) *进行子控件一次性的属性设置(有些属性只需要设置一次,比如字体、固定的图片) 3> 提供2个模型 *数据模型:存放文字数据\图片数据 *frame模型:存放数据模型\所有子控件的frame\cell的高度 4> cell拥有一个frame模型(不要直接拥有数据模型) 5> 重写frame模型属性的setter方法:在这个方法中设置子控件的显示数据和frame 6> frame模型数据的初始化已经采取懒加载的方法(每个cell对应的frame模型数据只加载1次)
五、静态单元格
1> 通过没storyboard设置tableview的content属性,static是静态单元格,dynamic是动态添加的2> 静态单元格适用于tableview里面的cell内容和现实都是固定的,后续不需要更改cell内部的内容
3> 如果tableview中显示的内容需要改变的就不能用静态单元格
六、动态单元格
应用程序管理1>cell重用容易出现从缓存池中取出来的cell 可能是之前更改过状态的cell,所以在重用的时候必须覆盖所有cell中子控件的状态。 2>当cell从storyboard中tableviewcontroller中唯一标示中取出来的时候,控制器可以不做初始化操作,if(cell == nil){};因为storyboard中确实已经存在了cell了 3>storyBoard中自定义cell的时候,可以创建多个cell的模型,然后根据唯一标示可以取出相应的cell 4>按钮能不能用取决于当前cell有没有下载
补充:
1、字符串的尺寸
// NSString字符串中对象方法: - (CGSize)sizeWithFont:(UIFont *)font maxSize:(CGSize)maxSize { NSDictionary *attrs = @{NSFontAttributeName : font}; return [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size; }
2、图片的随意不变形(直接Xcode中设置图片就行)
+ (UIImage *)resizableImage:(NSString *)name { UIImage *normal = [UIImage imageNamed:name]; CGFloat w = normal.size.width * 0.5; CGFloat h = normal.size.height * 0.5; return [normal resizableImageWithCapInsets:UIEdgeInsetsMake(h, w, h, w)]; }
相关文章推荐
- UITableView 实现汽车品牌(demo)
- UITableView 基本使用方法总结
- UITableView一些易混属性和方法
- UITableView的详细讲解
- (转)UITableViewController重要配置方法和Delegate
- UITableView详细用法,UITableView指南,UITableView详细教程
- ios隐藏uitableview下面多余的tableview的线条
- 定制UITableViewCell的事件响应处理
- ios关于tableView的重用
- IOS UITableView 实现LOL数据展示
- iOS- UITableView
- 仿QQ控件图片下拉放大效果
- QQ分组
- 关于SearchaBar的bookMarks(代理方式实现)
- UITableView
- tableviewcell 侧滑删除 点击返回按钮 程序崩溃 [ tableView:canEditRowAtIndexPath:]:message sent to deallocated insta
- UIScrollView的使用大全--contentsize,contentInset和contentInset
- 关于TableViewCell 自适应(文字自适应)
- UITableView 实现异步加载图片之改进
- 解决IOS中UITableViewStylePlain 时对headerview的隐藏