关于tableView:cellForRowAtIndexPath的解释
2017-07-31 18:19
525 查看
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CMainCell = @"CMainCell"; // 0 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CMainCell]; // 1 if (cell == nil)
{ cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CMainCell] autorelease]; // 2 } // Config your cell cell.textlabel.text = @"XXX"; // 3 return cell; }
可以这样理解,cell有一个地方(假设称为队列),专门存放那些生成过的,但是后来由于滚动tableView而隐藏起来的cell,而代码中语句1就是从队列中根据标示符取出一个暂时不用的cell,只有cell为nil,也就是队列中没有旧的cell的时候,才会执行语句2,生成一个新的cell。如果有旧的,就不用执行语句2了,这样节省资源,算作一种重用吧。在tableView初始化的时候队列中肯定没有cell的,所以每个cell生成的时候都会执行一遍2,当屏幕显示满了,向上滚动显示下一行时,就会把第一行隐藏,放到那个队列中,然后新增加的一行执行语句1的时候,结果就不是nil了,然后,就跳过语句2了,这样就节约资源了。
当然,上面这样对于使用系统提供的cell格式是没有什么问题,但是如果自己在cell上添加一些控件时,比如一个label,有时就会出现问题。尤其是各个cell的label的文字不相同时。首先这个添加的过程一定要在语句2之后,这样才是一次添加,如果放在语句3之后,那么由于cell的重用可能旧的上面已经有label了,你再添加一个,造成多次添加。其次label的文本值必须保证每次都要重新设置,也就是在语句3之后设置,这样才能保证每次必须执行。如果放在语句2后面,那么当使用旧的cell时,仍会保留旧的label文字,这是不对的。所以是在2后添加,在3后设置,可以在2添加的时候设一个tag值,这样可以在3处通过tag值获取控件设置。
关于语句0,如果每个cell的结构完全相同,那没问题,就用这一个标识符,但是如果各个cell结构不完全相同,有的有textfield,有的有button,有的有switch,那就不能互相重用了,只能每行用不同的标识符了,可以方便的利用(@"CMainCell%d",
indexPath.row),保证不会重复,多组的再加上组号。那这还有必要用语句2吗?还是需要的,因为当自己滚动隐藏,下次再显示出来的时候,还是可以重用的。标识符完全可以每次用一个新的,但为了最大限度的重用性,节省资源,才想了这么多办法。
总之,注意添加控件的位置,注意设置控件的位置,注意cell标识符。
此篇为转载,本人正处于学习iOS阶段,发到博客,以防以后找不到
原地址:http://blog.csdn.net/winsdom123456/article/details/7363383
{ cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CMainCell] autorelease]; // 2 } // Config your cell cell.textlabel.text = @"XXX"; // 3 return cell; }
可以这样理解,cell有一个地方(假设称为队列),专门存放那些生成过的,但是后来由于滚动tableView而隐藏起来的cell,而代码中语句1就是从队列中根据标示符取出一个暂时不用的cell,只有cell为nil,也就是队列中没有旧的cell的时候,才会执行语句2,生成一个新的cell。如果有旧的,就不用执行语句2了,这样节省资源,算作一种重用吧。在tableView初始化的时候队列中肯定没有cell的,所以每个cell生成的时候都会执行一遍2,当屏幕显示满了,向上滚动显示下一行时,就会把第一行隐藏,放到那个队列中,然后新增加的一行执行语句1的时候,结果就不是nil了,然后,就跳过语句2了,这样就节约资源了。
当然,上面这样对于使用系统提供的cell格式是没有什么问题,但是如果自己在cell上添加一些控件时,比如一个label,有时就会出现问题。尤其是各个cell的label的文字不相同时。首先这个添加的过程一定要在语句2之后,这样才是一次添加,如果放在语句3之后,那么由于cell的重用可能旧的上面已经有label了,你再添加一个,造成多次添加。其次label的文本值必须保证每次都要重新设置,也就是在语句3之后设置,这样才能保证每次必须执行。如果放在语句2后面,那么当使用旧的cell时,仍会保留旧的label文字,这是不对的。所以是在2后添加,在3后设置,可以在2添加的时候设一个tag值,这样可以在3处通过tag值获取控件设置。
关于语句0,如果每个cell的结构完全相同,那没问题,就用这一个标识符,但是如果各个cell结构不完全相同,有的有textfield,有的有button,有的有switch,那就不能互相重用了,只能每行用不同的标识符了,可以方便的利用(@"CMainCell%d",
indexPath.row),保证不会重复,多组的再加上组号。那这还有必要用语句2吗?还是需要的,因为当自己滚动隐藏,下次再显示出来的时候,还是可以重用的。标识符完全可以每次用一个新的,但为了最大限度的重用性,节省资源,才想了这么多办法。
总之,注意添加控件的位置,注意设置控件的位置,注意cell标识符。
此篇为转载,本人正处于学习iOS阶段,发到博客,以防以后找不到
原地址:http://blog.csdn.net/winsdom123456/article/details/7363383
相关文章推荐
- 关于错误 reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'
- 关于UITableView 不能回调 tableView: cellForRowAtIndexPath的问题
- 使用storyboard显示UITableView时,如果不修改系统默认生成的tableView:cellForRowAtIndexPath:方法中的代码,则必须为UITableViewCell注册(填写)重用标识符:identifier.必须要代码方法中的标识符一致.
- 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:
- Ios 自定义表示图出现的相关问题UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath不执行的问题
- UITableView不掉用tableView: cellForRowAtIndexPath方法
- -tableView: cellForRowAtIndexPath:方法不执行问题
- [tableView dequeueReusableCellWithIdentifier:CellIdentifier] 后面forIndexPath:indexPath参数的解释
- tableView代理方法的调用时间,(主要是heightForRowAtIndexPath和cellForRowAtIndexPath调用时间)
- UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath
- [ios] tableView:cellForRowAtIndexPath: unrecognized selector sent to instance
- 【iOS】tableView:cellForRowAtIndexPath: 方法未调用
- UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath
- UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;方法意思
- tableview:cellForRowAtIndexPath:不执行的原因
- tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- tableView:cellForRowAtIndexPath:
- UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath