[IOS]关于设计TableView和TableViewCell之基础篇
2015-04-20 16:43
309 查看
先谈基础:
1.TableViewCell系统自定义样式:在默认UITableViewCell分别有contentview和accessoryView这两个subview.其中contentview的默认有3个子视图,两个UILab(分别由textLabel和detailTextLabel属性访问)和一个UIImageView(由imageView属性访问),这三个子视图是否显示以及具体位置由UITableViewCell的样式类型决定,该样式类型是一个枚举类型:
在UITableViewCell的初始化方法(initWithStyle:reuseIdentifier:)中,第一个参数传入的便是该枚举类型的值,具体这四种自带样式是怎么影响前面所说的三个子视,百度一下便知.而accessoryView则是由UITableViewCell的accessoryType属性和accessoryView属性来决定,后者优先级高(即如果同时设置了这两个属性,那么最终accessoryView的效果由后者来决定),其中accessoryType属性是一个枚举类型
,具体每种枚举值是怎样一个accessoryView的效果,百度便知,而accessoryView属性则是可以任意UIView控件,比如iphone设置界面中飞行模式那个Cell,后面跟的是一个开关类型的accessoryVIew,但是accessoryType属性中的所有枚举值均没有这种效果,所以此时你便可以直接新建一个UISwitch控件的类型的对象,然后将accessoryVIew属性赋值为该对象.
2.TableViewCell的重用机制:关于这点,网上查了很多资料,看了之后,说说我自己的理解,在TableView中,每次将原先未显示的Cell拉入到显示区域,这时就会重新调用(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法来获取该Cell的对象,如果你在该方法中仅仅只是普通地创建UITableViewCell对象,然后配置好返回的话,那么有可能就会申请创建了很多很多对象,即使你这个TableView总的UITableViewCell数量不多,但是如果你反复上下拖动,,那么每次新进入到显示区的UITableViewCell都会调用一次上面所说的方法创建一个UITableViewCell对象,后果不堪设想,所以解决的办法就是为某一类相同样式的UITableViewCell定义一个标识,然后在上面的方法中不直接创建UITableViewCell对象,而是调用UITableView的dequeueReusableCellWithIdentifier:(NSString
*)identifier forIndexPath:(NSIndexPath *)indexPath的方法来重用UITableViewCell对象,然后重新配置,这样就不会有很多UITableViewCell对象被创建占内存了,比如某个TableView显示区域同时只能显示5个UITableViewCell,当用户往下拖动第6个UITableViewCell出现在显示区域,此时因为在TableVIew的缓存资源池中没有UITableViewCell对象,所以这时会新创建一个UITableViewCell对象(新创建对象需由开发者自己用代码写,但是如果在storyboard中已经定义该种标识的UITableViewCell,那么dequeueReusableCellWithIdentifier便能自动创建,不需要人为写代码创建,下面示例代码会说明),但是此时因为第一个UITableViewCell对象已经不在显示区域中了,所以该对象会被放入TableView对象的资源池中,当用户继续往下滚或者往上回滚的话,那么新进入到显示区的UITableViewCell在执行(UITableViewCell
*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法的时候不会再创建对象,而是复用了前面资源池中已有的那个对象,然后重新配置,然后显示.示例代码如下:
3.关于UITableViewController 类,UITableViewDataSource代理,UITableViewDelegate代理的分析
这里就简单讲一下,平常大家在设计的时候基本都让自定义的TableViewController(继承于UITableViewController)实现相应的UITableViewDataSource和UITableViewDelegate协议,从而使自定义的TableViewController同时也作为该Table的data source和delegate,前面所用的(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath其实是UITableViewDataSource协议中的方法,而非UITableViewController类中的方法.
1.TableViewCell系统自定义样式:在默认UITableViewCell分别有contentview和accessoryView这两个subview.其中contentview的默认有3个子视图,两个UILab(分别由textLabel和detailTextLabel属性访问)和一个UIImageView(由imageView属性访问),这三个子视图是否显示以及具体位置由UITableViewCell的样式类型决定,该样式类型是一个枚举类型:
typedef enum : NSInteger { UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewCellStyleSubtitle } UITableViewCellStyle;
在UITableViewCell的初始化方法(initWithStyle:reuseIdentifier:)中,第一个参数传入的便是该枚举类型的值,具体这四种自带样式是怎么影响前面所说的三个子视,百度一下便知.而accessoryView则是由UITableViewCell的accessoryType属性和accessoryView属性来决定,后者优先级高(即如果同时设置了这两个属性,那么最终accessoryView的效果由后者来决定),其中accessoryType属性是一个枚举类型
typedef enum : NSInteger { UITableViewCellAccessoryNone, UITableViewCellAccessoryDisclosureIndicator, UITableViewCellAccessoryDetailDisclosureButton, UITableViewCellAccessoryCheckmark, UITableViewCellAccessoryDetailButton } UITableViewCellAccessoryType;
,具体每种枚举值是怎样一个accessoryView的效果,百度便知,而accessoryView属性则是可以任意UIView控件,比如iphone设置界面中飞行模式那个Cell,后面跟的是一个开关类型的accessoryVIew,但是accessoryType属性中的所有枚举值均没有这种效果,所以此时你便可以直接新建一个UISwitch控件的类型的对象,然后将accessoryVIew属性赋值为该对象.
2.TableViewCell的重用机制:关于这点,网上查了很多资料,看了之后,说说我自己的理解,在TableView中,每次将原先未显示的Cell拉入到显示区域,这时就会重新调用(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法来获取该Cell的对象,如果你在该方法中仅仅只是普通地创建UITableViewCell对象,然后配置好返回的话,那么有可能就会申请创建了很多很多对象,即使你这个TableView总的UITableViewCell数量不多,但是如果你反复上下拖动,,那么每次新进入到显示区的UITableViewCell都会调用一次上面所说的方法创建一个UITableViewCell对象,后果不堪设想,所以解决的办法就是为某一类相同样式的UITableViewCell定义一个标识,然后在上面的方法中不直接创建UITableViewCell对象,而是调用UITableView的dequeueReusableCellWithIdentifier:(NSString
*)identifier forIndexPath:(NSIndexPath *)indexPath的方法来重用UITableViewCell对象,然后重新配置,这样就不会有很多UITableViewCell对象被创建占内存了,比如某个TableView显示区域同时只能显示5个UITableViewCell,当用户往下拖动第6个UITableViewCell出现在显示区域,此时因为在TableVIew的缓存资源池中没有UITableViewCell对象,所以这时会新创建一个UITableViewCell对象(新创建对象需由开发者自己用代码写,但是如果在storyboard中已经定义该种标识的UITableViewCell,那么dequeueReusableCellWithIdentifier便能自动创建,不需要人为写代码创建,下面示例代码会说明),但是此时因为第一个UITableViewCell对象已经不在显示区域中了,所以该对象会被放入TableView对象的资源池中,当用户继续往下滚或者往上回滚的话,那么新进入到显示区的UITableViewCell在执行(UITableViewCell
*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法的时候不会再创建对象,而是复用了前面资源池中已有的那个对象,然后重新配置,然后显示.示例代码如下:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //若在storyboard中已经定义了有标识的UITableViewCell,那么这句话可以省略 static NSString *ID=@"ID"; UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ID]; //若在storyboard中已经定义了有标识的UITableViewCell,那么这句话可以省略 //因为storyboard中若有对应UITableViewCell,那么执行dequeueReusableCellWithIdentifier,若资源池没可用UITableViewCell会自动创建.不可能返回nil if (cell==nil) { cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]; } //3.配置该行cell的数据 ......... //4.返回cell return cell; }
3.关于UITableViewController 类,UITableViewDataSource代理,UITableViewDelegate代理的分析
这里就简单讲一下,平常大家在设计的时候基本都让自定义的TableViewController(继承于UITableViewController)实现相应的UITableViewDataSource和UITableViewDelegate协议,从而使自定义的TableViewController同时也作为该Table的data source和delegate,前面所用的(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath其实是UITableViewDataSource协议中的方法,而非UITableViewController类中的方法.
相关文章推荐
- [IOS]关于设计TableView和TableViewCell之实际操作篇
- 【iOS开发学习】关于在TableView里添加搜索的问题。
- iOS 关于tableView cell的分割线的一些设置
- iOS 关于tableView 的一些记录
- 关于iOS 11 tableView跟导航栏之间有空白和tableview的头视图问题
- iOS 工作中遇到的一个tableView设计
- iOS tableView 下拉列表的设计
- ios 关于tableview的复用问题,避免假复用
- iOS 设计中关于UIScrollViewDelegate的几个代理方法的简单介绍
- iOS 关于tableView cell的分割线的一些设置
- 关于iOS 11 tableView自动布局懵逼的事
- ios 关于tableview小技巧
- iOS开发:代码通用性以及其规范 第二篇(猜想iOS中实现TableView内部设计思路(附代码),以类似的思想实现一个通用的进度条)
- 关于iOS中Tableview的反弹效果
- iOS关于TableView的moveRowAtIndexPath相关介绍
- IOS-38-关于tableview中经常不被重视的错误纠正
- 郑州iOS點 - 关于tableView 和 collectionView 在ReloadData时候闪烁的问题
- ios tableview/collectionView关于点击cell后 刷新cell
- 关于iOS TableView旋转后头部空白的问题
- IOS关于tableview自动下移