从TableViewCell上的UITextField获取文本

时间:2012-04-27 19:32:35

标签: ios xcode uitextfield uitableview

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

在这个子类上,我创建了一个UITableViewController是其委托的协议,这样每当这些textFields发生变化时,TableViewController就会知道它。基本上我想要这个来保存NSUserDefaults上的值

此外,为了从这些textFields动态获取值,我可以这样做:

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

大部分时间都可以正常工作。但是当textField在视图之外因为它已滚动时,我从textField.text获得的值是(null)。一旦它再次进入视图,一切都恢复正常。

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

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

当textFields位于视图之外时,还有其他方法可以获取它们的值吗?

提前致谢!

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

正如Thyraz所说,UITableView只保留可见矩形的单元格 - 以及允许滚动的合理缓冲区。这就是为什么“重用标识符”非常重要,它们表明哪些单元格可用于哪些表格(当你有多个表格需要担心时,这一点很关键)。不幸的是,这本身并不能回答你的问题。

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

编辑:这意味着是的,您应该将此数据存储在其他位置,通常以包含表视图的视图控制器类的属性形式存储。我建议使用NSArray用于此目的,但您也可以通过dicts甚至是 last 度假村(理论上你可以做到这一点,但这是一个一系列属性,令人难以置信的坏主意。就个人而言,我几乎总是使用NSArrays,因为它们的结构是以适合问题的方式构建的,但理论上你可以采用其他方式。 (我已经使用了基于dict的结构一次,这是我的数据在递归结构中嵌套在其中的情况)

答案 2 :(得分: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
    }
}