在我的应用中,我有一些views
需要就地editable
。我已经设置了tableviewcells
以包含已启用的UITextField
,并且文本可以更改,这很好,它可以正常工作。
我的问题是跟踪这些问题的最佳方法是什么?我应该:
textfield
的iVar。如果是的话
cell
仅实例化一次,如何确保每个textfield
都有正确的字段?cell
时添加cell
,并在配置cell
时设置其值。如果是的话
view
退出cells
然后返回,则其值将重置为原始值而不是已修改的值。您通常倾向于在此方案中使用哪种方法?特别是如果您正在处理大量{{1}}。
答案 0 :(得分:10)
将所有文本字段的值存储在数据模型中的可变数组中。
在tableView:willDisplayCell:forRowAtIndexPath:
中设置文本字段的值,使用基于索引路径的数组中的值。
当文本字段结束编辑时,立即将值存回数组。已有一个协议(所以不需要编写自己的协议),但它比普通的更棘手,因为你没有传递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 :(得分:3)
子类UITableViewCell并在其init方法中添加UITextField。
为自定义单元类创建协议。当UITextField开始编辑或结束编辑时,请调用委托的方法。
在控制器中,实现自定义单元格的协议并将indexpath行值设置为tableView中的单元格标记:cellForRowAtIndexPath:
因此,每次编辑UITextField时,您都可以在控制器中知道哪一行正在编辑(通过单元格标记)
答案 2 :(得分:2)
最好的方法是遵循MVC并实现您的模型,在您的情况下是文本字段值。您所做的是将这些值存储在数组中,并在您的cellForIndexPath方法中引用数组中的正确值。例如,表的第一行(indexPath.row == 0)将检索数组中的第一个元素。 textField中的更改将记录在数组中的相应元素上。