ViewWillAppear中UITableView单元的有效性

时间:2014-07-18 07:12:34

标签: ios iphone objective-c uitableview ios5

我有什么
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.

<小时/> 的的问题:
1)获取Cell的正确方法是什么?

2)或者,到-viewWillAppear时,UITableView还没准备好吗?

我确定。

3 个答案:

答案 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];