解决tableView cellForRowAtIndex 返回nil 的问题
2015-05-18 15:32
459 查看
**版权所有,请大家尊重原创劳动,转载请注明出处** 最近在做项目中遇到一个蛋疼的问题,网上查找各种资料,仍不得解。最后偶然的一次尝试才终于碾死这只臭虫(bug)。 当时现场情况是这样的。在项目中,我在一个页面push 到一个设置页面(自定义的viewController,不是系统的设置页面),里边有一些常见的app设置项,像帮助了,关于了,反馈了,等等一些乱七八糟的东西。 ![图1-1](http://img.blog.csdn.net/20150518145652471) 鉴于列表结构简单,清除缓存一行cell上再加个label就OK了。label显示app缓存的文件大小,点击那一行时label显示“正在清理”,清理完毕显示缓存大小。所以label就有这3种状态。这样只要能够找到label就能够改变其显示内容。从而达到我们想要的效果。 cellForRow代码如下
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *identifer = @"setIdentifer"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifer]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifer]; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(SCREEN_WIDTH - 120, 10, 80, HEIGHTOFTABLE - 10*2)]; label.tag = TagOfLabel; label.textAlignment = NSTextAlignmentCenter; label.font = [UIFont systemFontOfSize:18.0f]; label.textColor = [UIColor blackColor]; [label setHidden:YES]; [cell.contentView addSubview:label]; } cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; cell.textLabel.text = self.titleArray[indexPath.row]; if ([self.titleArray[indexPath.row] isEqualToString:@"清除缓存"]) { UILabel *label = (UILabel *)[cell.contentView viewWithTag:TagOfLabel]; label.hidden = NO; } return cell; }
小心了,**臭虫**出现。 在我建好tableView之后通过*cellForRowAtIndexPath*方法去找这个清除缓存的cell时,却返回了nil(indexPath没问题)。这让我很郁闷,于是各种查资料,但并没有发现*cellForRowAtIndexPath*这个方法使用时的特别之处。[stackOverflow也没找到解决办法](http://stackoverflow.com/)。 首先,可能有些人还没单独调用*cellForRowAtIndexPath*这个方法来定位某一行cell。它是UITableview 的代理方法之一,但它也可以用来返回某一行cell。你可以在*viewDidLoad*等方法里调用,得到cell。从而对cell进行单独设置。 用法如下:
NSIndexPath *indexpath = [NSIndexPath indexPathForRow:4 inSection:0]; UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexpath];
我们配置一下*indexpath*就行了,如果是自定义的cell,强转一下就可以了。 对于返回nil的原因我还不得而知,重新建立demo,遗憾的是并未出现类似的问题。 [demo在此](http://download.csdn.net/detail/oximing1/8712527) 最后说一下解决办法,很简单。 **延迟执行** 延迟多长时间不重要,姑且延迟0.01s执行。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSIndexPath *indexpath = [NSIndexPath indexPathForRow:4 inSection:0]; UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexpath];
UILabel *label = (UILabel *)[cell.contentView viewWithTag:TagOfLabel];
label.backgroundColor = [UIColor brownColor];
});
在项目确实解决了问题。所以建议大家调用该方法时也尽量这样写,以防不测。 OK,bug解决,希望可以帮到有此问题的小伙伴,欢迎大家批评指正。
相关文章推荐
- tableview 代理方法cellForRowAtIndex中 return cell用法不当导致的问题。
- 如何解决关于TableView里面cell随机显示的问题
- 如何解决关于TableView里面cell随机显示的问题
- IOS 开发之实现取消tableView返回时cell选中的问题
- 解决自定义可左右滑动cell时和tableview的滑动手势冲突问题
- 解决tableView cell添加阴影滑动卡顿问题,只需多两行代码
- 解决TableView的Cell重用问题
- 在含有WebView、ScrollView和TableView等的Controller中侧滑返回无效,解决侧滑返回,又遇到假死问题的解决办法
- 表视图单元函数 tableView:cellForRowAtIndex:
- 如何解决关于TableView里面cell随机显示的问题
- 解决tableView中cell动态加载控件的重用问题
- Ios 该图显示其出现的相关问题定义UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'
- 关于UITableView 不能回调 tableView: cellForRowAtIndexPath的问题
- UITableView reloadData后,cellForRowAtIndex方法未调用问题
- TableView的cell加载倒计时重用问题解决方案
- iOS UITableView-FDTemplateLayoutCell框架 cell重叠 高度返回0.5问题解决
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath不执行的问题
- ios tableview 那些事(二十三) 解决headerView不随cell一起滚动的问题
- iOS中关于动态Tableview中的cell数据传输的多线程问题解决之拙见
- 如何解决关于TableView里面cell随机显示的问题