UItableView和UIcollectionView是日常生活中应用最多的,可以实现很多功能,创建的方式也有几种,下面简单总结下,创建UItableViewCell的几种情况:
1.通过加载storyBoard的UItableViewCell
在sotrybord中拖入的tableView中,选中Content,里面就有静态cell和动态cell了。其中两者的区别是,静态cell固定不动,直接通过控制面板添加属性就可以创建了,而动态cell也就是当我们拖入tableView,需要实现数据源方法才有数据显示的就是动态cell。
动态cell代码如下:
```
- (NSInteger) numberOfSectionsInTableView:(UITableView *)和- (NSInteger)
numberOfSections方法默认是1组,这个代理方法可以不写,如果不写那么,系统默认是一组
-tableView(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
```
这两个方法是必须实现的,如果不实现,那么系统会崩溃。其中系统的UITableViewCell有三个自带的属性分别是:imageView 、textLabel、detailTextLabel 。分别给三个属性赋值,实现了最基本的数据源方法,那么基本就有数据显示了。
2.通过代码创建UItableViewCell
代码创建UItableViewCell,其中代码需要明白为什么需要自定义代码创建cell?
代码创建cell,主要是因为系统的cell不能满足开发的需要。这里普及下cell的重用机制。每一个UITableView里都维护着一个cell队列,当UITableView刚加载的时候,cell队列里是没有任何数据的。dequeueResableCellWithIdentifier从字面上理解就是”出列可重用的cell",也就是根据一个标识identifier从cell队列里取出一个UITableViewCell,也就是从缓冲池加载cell,当然了,如果cell队列里没有此标识的cell,调用此方法的结果就是返回nil。因此,在UITableView刚加载的时候,cell队列里没有可用的cell,所以必须通过语句
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
来创建对应CellIdentifier标识的UITableViewCell实例。
[ tableView:cellForRowAtIndexPath:方法主要是根据nsindex取得一个cell ]
而当UITableView在滚动的时候导致UITableViewCell滚出手机屏幕视图的时候,程序会将这一个UITalbeViewCell实例放入此UITableView所维护的cell队列中(缓冲池中)。当UITableview中有新的UITableViewCell需要展现在手机屏幕视图上时,就会调用tableView:cellForRowAtIndexPath:方法了。因此我们可以知道以下几点:
1-重取出来的cell是有可能已经捆绑过数据或者加过子视图的,所以,如果有必要,要清除数据(比如textlabel的text)和remove掉add过的子视图(使用tag)。
2-这样设计的目的是为了避免频繁的 alloc和delloc cell对象而已,没有多复杂。
3-设计的关键是实现cell和数据的完全分离
重点代码:
在自定义的cell的.m文件返回自定义的cell
+ (instancetype) heroCell:(UITableView *)tableView
{
static NSString *ID=@"hero";
//1.查找可重用cell
CZHeroCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];
//2.判断是否成功获取了可重用cell,如果没有,则创建
if (cell==nil) {
cell=[[CZHeroCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
}
//3.返回
return cell;
}
那么在控制器的数据源方法中,就可以直接调用封装好的创建cell的方法,直接创建cell。
3.用xib创建cell
其中用xib创建cell的时候,需要注意的是在自定义cell的类中,需要告诉cell是通过xib 创建的
+ (instancetype)tgCell //封装cell
{
//创建cell--告诉从xib文件创建cell
NSBundle *bundle=[NSBundle mainBundle];
CZTgCell *cell=[[bundle loadNibNamed:@"CZTgCell" owner:nil options:nil] lastObject];
return cell;
}
2016.3.12