解决tableView cellForRowAtIndex 返回nil 的问题
来源:互联网 发布:杭州龙席网络销售什么 编辑:程序博客网 时间:2024/05/29 18:02
**版权所有,请大家尊重原创劳动,转载请注明出处** 最近在做项目中遇到一个蛋疼的问题,网上查找各种资料,仍不得解。最后偶然的一次尝试才终于碾死这只臭虫(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解决,希望可以帮到有此问题的小伙伴,欢迎大家批评指正。
0 0
- 解决tableView cellForRowAtIndex 返回nil 的问题
- TableView的cell返回nil问题
- 解决 pathForResource 返回 nil的问题
- 解决 pathForResource 返回 nil的问题
- tableview 代理方法cellForRowAtIndex中 return cell用法不当导致的问题。
- 解决NSData转NSString返回nil的问题
- 解决NSData转NSString返回nil的问题
- 解决NSData转NSString返回nil的问题
- 解决使用 model 时后台返回 null 或 nil 数据而造成的崩溃问题
- 解决pathForResource返回nil, 无法读取plist文件问题
- YUV420p的数据想要在IOS中显示,转CIImage总是返回nil 问题未解决,这里记录下
- pathForResource返回nil的解决方法
- 解决TableView的Cell重用问题
- 解决tableview下滑隐藏HeaderInSection的问题
- 解决Xcode断点调试值都为nil的问题
- 解决 "cc.CardinalSplineTo:create() method is nil" 的问题
- 解决Xcode断点调试值都为nil的问题
- kvc nil的问题
- FatMouse's Speed(HDU-1160)
- 单向链表
- bzoj 1758: [Wc2010]重建计划
- NFS安装与使用
- DEV控件的Gridview小技巧总结
- 解决tableView cellForRowAtIndex 返回nil 的问题
- iOS面试 block
- HighCharts资料(二)
- angular学习之路---scope作用域
- 站内结构优化
- 如何恢复电脑误删的文件?
- ios面试题 多线程
- Android上使用OpenCV处理图像
- ios、android 数据可视化图表赏析