从TableViewCell上的UITextField获取文本

我有一个UITableViewController,原型单元格包含UITextFields。 为了配置这些客户单元,我创建了一个UITableViewCell子类。 我已经通过sockets(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超出视图范围时获取它们的值吗?

提前致谢!

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

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

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

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

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

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 } }