如果UITableViewCell不可见,则它是零

时间:2012-03-02 08:55:07

标签: iphone objective-c ios uitableview

在我的应用中,我正在使用ELCTextfieldCell。我们的想法是使用用户输入的数据进行一些计算。但是有问题。我有大约14个单元格,当然,它们不能全部适合屏幕。因此,当我点击OK时,应用程序正在检查所有fiel是否已填写:

BOOL complete = YES;
for (int i = 0; i < [cellTextArray count] - [self.numberOfBools intValue]; i++) {
    NSIndexPath *iPath = [NSIndexPath indexPathForRow:i inSection:0];
    ELCTextfieldCell *theCell = (ELCTextfieldCell *)[self.tableView cellForRowAtIndexPath:iPath];
    if (!theCell.rightTextField.text)
        complete = NO;
}

如果所有单元格都可见,则此代码可以正常工作,但如果某些单元格已经显示,则complete变为NOtheCellgdb的输出为:

(gdb) po theCell
Can't print the description of a NIL object.

有人可以帮助我朝正确的方向发展吗? :)

所有帮助将不胜感激,谢谢。

修改

self.numberOfBools只是NSNumber,在这些行中总共有bool。他们使用UISwitches而非UITextField作为其他单元格,因此我将其排除在支票之外。

3 个答案:

答案 0 :(得分:1)

这是设计的。 UITableView中的单元格是可重用的,并且可以在不可见时释放它们以节省资源。您必须将数据存储在除了单元格之外的其他位置。

答案 1 :(得分:1)

完全需要计算支持细胞而不是细胞本身的数据。让我解释一下。

单元格是数据的直观表示,当它不在视图中时,运行时将释放它,这就是它为零的原因。

然而 cellForRowAtIndexPath:从数据创建单元格吗? (或这样做是正常的)所以当用户更新cell.rightTextField时你应该更新data.rightTextField然后完成应该看起来类似于...这是伪代码不可编译

complete = YES;
for (Data* data in myDataSet) {
    if (!data.rightTextField)
        complete = NO;
}

因此,总结单元格表示数据,并且不保证它们会持续存在。您自己可以确保数据持久化;因此,测试数据的完整性,而不是细胞。

答案 2 :(得分:0)

我同意Damo和anticyclope的观点。你应该更新

theCell.rightTextField.text

首先进入表格的数据源。

然后,您可以根据数据源进行计算。 让textFieldArray成为表格的数据源。

NSMutableArray *textFieldArray;

myTableView.dataSource = textFieldArray;

然后需要在更新文本字段时更新数据源。 最后,您可以处理数据源。