NineYao 2012-07-16
注意:以下内容为个人理解,如有错误请指正,不胜感激。
UITableView继承自UIScrollView,可以自动响应滚动事件,每一行对应一个UITableViewCell对象,每个cell都都可以自定义,当cell被显示时就会调用tableView:cellForRowAtIndexPath方法创建或获取一个cell;而不可视时,它又会被释放。
在ios中tableView有两种基本类型:plain和grouped,两者的样式不一样。plain类型的tableView可以当做所有的cell都在一个section中,而grouped类型的tableView会分成多个组,每一个组叫做section,包含若干个cell,所以在grouped类型的tableView中,需要通过section和row来确定一个cell,在iso中用一个NSIndexPath来标识一个cell。
geouped类型的tableView中,每个section都可以设置head,foot,cells;
优化UITableView请参考:
http://www.keakon.net/2011/08/03/%E4%BC%98%E5%8C%96UITableView%E6%80%A7%E8%83%BD
第一种方式是在一个nib文件中拖动创建一个tableView在程序中使用,该nib文件对应的controller应该实现两个委托UITableViewDelegate和UITableViewDataSource。然后在.m文件中必须实现两个方法:
tableView:cellForRowAtIndexPath //用来创建每一个tableViewCell
tableView:numberOfRowsInSection: //返回当前的section的行数,如果tableView类型是plain,默认就是一个section
第二中方式是在代码中创建tableView,这种方法不常使用。
从字面上理解是“离队的可重用的cell”,这些cell不在屏幕显示,但是还存在。
使用时要注意:
1、重取出来的cell是有可能已经捆绑过数据或者加过子视图的,所以,如果有必要,要清除数据(比如textlabel的text)和remove掉add过的子视图(使用tag)。
2、这样设计的目的是为了避免频繁的 alloc和delloc cell对象而已,没有多复杂。
3、设计的关键是实现cell和数据的完全分离
4、"一个屏幕显示的cell数量"是有限的,当屏幕滚动时候,就会调用方法获取新的cell,而老的cell会在屏幕外面就不显示了。显示新的cell时,如果有“相同类型”(identifier)的cell,就从队列拿一个出来,设置数据,显示出来
5、queue中cell的数量会自动控制,要注意的是queue里面存储的是cell的实例,不是“原型”。如果每个cell的结构完全相同,那没问题,就只用这一个标识符,但是如果各个cell结构不完全相同,有的有textfield,有的有button,有的有switch,那就不能互相重用了,只能每行用不同的标识符了,可以方便的利用(@"CMainCell%d", indexPath.row),保证不会重复,多组的再加上组号。那这还有必要这么做吗?还是需要的,因为当自己滚动隐藏,下次再显示出来的时候,还是可以重用的。标识符完全可以每次用一个新的,但为了最大限度的重用性,节省资源,才想了这么多办法。
6、值得一提的是,cell被重用时,它内部绘制的内容并不会被自动清除,因此你可能需要调用setNeedsDisplayInRect:或setNeedsDisplay方法。