在表格视图单元格中编辑文本字段的最佳方法。

5
在我的应用程序中,我有许多需要原地编辑的视图。我已经设置了tableviewcells以包括一个启用的UITextField,并且文本可以更改,这很好,它可以正常工作。
我的问题是什么是跟踪这些的最佳方法?我应该:
1. 保留每个textfield的iVar。如果是这样,那么 - 如果它只实例化一次,如何确保每个单元格都有正确的字段?
2. 当创建单元格时添加一个textfield并在配置单元格时简单地设置其值。如果是这样,那么 - 我如何跟踪这些值?如果单元格离开视图然后返回,它的值将被重置为其原始值而不是编辑后的值。
您通常在这种情况下使用哪种方法?特别是如果您正在处理大量的单元格。

这个问题如果放在 http://programmers.stackexchange.com/ 上会更好。 - iDev
我的错,抱歉。下次会注意的 :) - PaReeOhNos
3个回答

10
  1. 将所有文本字段的值存储在数据模型中的可变数组中。

  2. tableView:willDisplayCell:forRowAtIndexPath: 中设置您的文本字段的值,使用基于索引路径的数组值。

  3. 当一个文本字段结束编辑时,立即将其值存储回数组中。已经有一个协议来实现这个功能(所以不需要编写自己的代码),但它比正常情况下要棘手一些,因为您没有传递 indexPath 并且需要找到与您的文本字段相关联的那个。

- (void) textFieldDidEndEditing:(UITextField *)textField {
    CGRect location = [self convertRect:textField.frame toView:self.tableView];
    NSIndexPath *indexPath = [[self.tableView indexPathsForRowsInRect:location] objectAtIndex:0];

    // Save the contents of the text field into your array:
    [yourArray replaceObjectAtIndex:indexPath.row withObject:textField.text];
}

1
太棒了!!! 这种方法比创建一个带有变量来存储indexPath的自定义文本字段要好得多。当您移动单元格时,这需要更少的努力。 - user1046037

3
  • 在UITableViewCell的init方法中创建一个UITextField并将其添加到子类中。

  • 为自定义单元格类创建一个协议。当UITextField开始编辑或结束编辑时,调用委托的方法。

  • 在控制器中,实现自定义单元格的协议,并将indexPath行值设置为tableView:cellForRowAtIndexPath:中单元格的标签。

因此,每次编辑UITextField时,您都可以知道正在编辑哪一行(通过单元格的标签在控制器中)。


2

最好的方法是按照MVC模式实现你的模型,而在这种情况下,你的模型是textfield的值。你需要将这些值存储在一个数组中,在cellForIndexPath方法中引用数组中正确的值。例如,表格的第一行(indexPath.row == 0)将检索数组中的第一个元素。文本字段中的更改将记录在数组中相应的元素上。


我该如何知道要更新数组的哪个元素?这仅基于索引路径还是当前单元格吗?因此,第5行可能映射到数组索引5(假设没有部分)。 - PaReeOhNos
索引路径是最好的方法。 - sosborn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接