1

我有一个 UITableViewController 原型单元格包含 UITextFields。为了配置这些自定义单元格,我创建了一个 UITableViewCell 子类。我已通过 outlet 将 textField 连接到单元格子类(nonatomic, weak)

在这个子类上,我创建了一个协议,UITableViewController 是它的委托,这样每当这些文本字段发生变化时,TableViewController 就会知道它。基本上我希望这可以保存 NSUserDefaults 上的值

此外,为了从这些文本字段中动态获取值,我可以这样做:

((TextFieldCell*)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:2 inSection:0]]).textField.text

大多数时候它工作正常。但是,当 textField 因为滚动而位于视图之外时,我从 textField.text 获得的值是(null)。一旦它再次出现在视野中,一切都会恢复正常。

我试图将出口从弱改为强,但无济于事。

我想我可以在类上定义一些私有的 NSString,并在调用委托协议时填写它们。问题是我想让我的代码尽可能通用,尽可能降低对私有变量的需求,主要是为了简化单元生成代码。

当它们在视图之外时,还有其他方法可以获取文本字段的值吗?

提前致谢!

4

3 回答 3

1

但是你知道 UITableView 只保留可见矩形的单元格吗?当一个单元格离开屏幕,而另一个单元格需要一个新单元格来移动到可见区域时,旧单元格将被重新用于新内容。

因此,表格视图的每一行都没有一个单元格。如果您的表格包含大量数据,则行数远多于单元格。

于 2012-04-27T19:50:37.920 回答
0

正如 Thyraz 所说,UITableView 只保留可见矩形的单元格——以及允许滚动的合理缓冲区。这就是“重用标识符”如此重要的原因,它们指示哪些单元格可用于哪些表格(当您需要担心多个表格时至关重要)。不幸的是,这本身并不能回答您的问题。

存储这些 textView 内容的责任不在 UITableView 的肩上。通过数据源委托协议提供该数据是您的工作,因此您应该查询数据源以获取该信息。

编辑:这意味着是的,您应该将此数据存储在其他地方,通常以包含表视图的视图控制器类的属性的形式。我建议为此目的使用 NSArray ,但你也可以通过 dicts 甚至在最后的手段来做到这一点(这在理论上你可以做到这一点,但这是一个非常糟糕的想法) ,一系列属性。就个人而言,我几乎总是使用 NSArrays,因为它们的结构适合问题,但理论上你可以用其他方式来做。(我只使用过一次基于 dict 的结构,那是我的数据以递归结构嵌套在自身内部的情况)

于 2012-04-27T19:55:13.607 回答
0

UITableViewController 一旦离开屏幕就不会保留单元格。您可以使用以下模式来获取以前使用的模式作为内存管理优化,但是您必须假设单元格每次出现在屏幕上时都需要重置它们的值(即使出队),因为不能保证什么值将是。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier1 = @"Cell1";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
    if( cell == nil ) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier1] autorelease];
        cell2.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        cell2.editingAccessoryType = UITableViewCellAccessoryNone;
    }   
    switch( indexPath.section ) {
        case first_Section:
            if( row == 0 ) {
                cell1.textLabel.text = @"Some Text";
                cell1.accessoryView = [self myCustomViewControl];
                cell = cell1;
            }
            ... etc
    }
}
于 2012-04-27T20:02:56.270 回答