【问题标题】:Best approach for editing text fields in a table view cell在表格视图单元格中编辑文本字段的最佳方法
【发布时间】:2013-01-16 04:36:02
【问题描述】:

在我的应用程序中,我有许多 views 需要就位 editable。我的tableviewcells 设置包含一个启用的UITextField,并且可以更改文本,这很好,它可以工作。

我的问题是跟踪这些的最佳方法是什么?我应该:

  • 保留每个 textfield 的 iVar。如果是的话
    • 如果每个 cell 仅实例化一次,我如何确保它具有正确的字段?
  • 在创建cell 时添加textfield,并在配置cell 时简单地设置其值。如果是的话
    • 如何跟踪这些值?如果cell 离开view 然后又返回,则其值将重置为其原始值,而不是编辑后的值。

对于这种情况,您通常倾向于使用什么方法?尤其是当您正在处理大量 cells 时。

【问题讨论】:

标签: ios objective-c cocoa-touch uitableview


【解决方案1】:
  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];
    }
    

【讨论】:

  • 太棒了!!!这种方法比使用变量来存储 indexPath 创建自定义文本字段要好得多。当您移动单元格时,这需要更少的努力
【解决方案2】:
  • 子类 UITableViewCell 并在它的 init 方法中添加一个 UITextField。

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

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

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

【讨论】:

    【解决方案3】:

    最好的方法是遵循 MVC 并实现您的模型,在您的情况下是文本字段值。您所做的是将这些值存储在一个数组中,并在您的 cellForIndexPath 方法中引用数组中的正确值。例如,表的第一行 (indexPath.row == 0) 将检索数组中的第一个元素。 textField 中的更改将记录在数组中的相应元素上。

    【讨论】:

    • 我如何知道要更新数组的哪个元素?那只是基于索引路径还是当前单元格?所以第 5 行可能映射到数组索引 5(假设没有部分)
    • 索引路径是最好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多