我有什么
1)。容器有UITableView
,其中有两个自定义UITableViewCells
。
2)。核心数据具有某个实体,该实体具有要显示的文本
每次进入UITableViewCell
时都会View
。
我在做什么?
1)我选择了-viewWillAppear
方法,每次视图可见时都会调用该方法。
2)在-viewWillAppear
中,我从核心数据中检索了数据。
3)从UITableView
NSUInteger idxArr[] ={2,0}; // 2 nd section, 0th Row.
NSIndexPath *cPath = [NSIndexPath indexPathWithIndexes:idxArr length:2];
myCell *tCell = (myCell *)[self.settings cellForRowAtIndexPath:cPath];
tCell.myLabel.text = rec.servername; // rec.servername is from DC.
当我登记lldb时,
tCell was nil.
<小时/> 的的问题:
2)或者,到-viewWillAppear
时,UITableView还没准备好吗?
我确定。
答案 0 :(得分:0)
您应该通过符合tableView dataSource协议来填充单元格,然后在viewWillAppear中,您应该在tableView上调用reloadData。
答案 1 :(得分:0)
在致电reloadData
进行查看之后,我们需要在从-scrollToRowAtIndexPath:
获取单元格之前致电-cellForRowAtIndexPath:
。
因为,当我们在第2部分中调用一行时,在我们滚动之前它可能不在可见区域中。因此,cellForRowAtIndexPath:
返回nil。
答案 2 :(得分:0)
方法-cellForRowAtIndexPath:
不应该以编程方式调用。它是UITableView
的数据源方法,它包含一些单元重用优化。如果您在向下滚动后更新视图,则会再次调用-tableView:cellForRowAtIndexPath
并且您的更改将不可见。
如果您要更新特定单元格,则应更新以下内容:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
YourCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellId" forIndexPath:indexPath];
YourData *data = //Get your data here
if (data.isReady) {
cell.tf.text = data[indexPath.row].text;
} else {
cell.tf.text = @"Not ready yet. Need to reload this cell later";
}
return cell;
}
然后在完成获取数据后调用下面的方法。
[self.tableView reloadRowsAtIndexPaths:(NSArray *) withRowAnimation:UITableViewRowAnimationFade];
如果你想重新加载整个tableView(通常它不慢),@ salaman140说你可以调用[self.tableView reloadData]
来更新所有可见的单元格。
如果我是你,我就不会使用:
NSUInteger idxArr[] ={2,0}; // 2 nd section, 0th Row.
NSIndexPath *cPath = [NSIndexPath indexPathWithIndexes:idxArr length:2];
我会(更清楚):
NSIndexPath *cPath = [NSIndexPath indexPathForRow:0 inSection:2];