我有一个带有每个 UITableViewCell
中的一个 UITextField
的 UITableView
。 我在我的视图控制器中编写了一个方法,用于处理每个单元格文本字段的“Did End On Exit”事件,并且我想要做的是使用新文本更新我的模型数据。
目前我拥有的是:
- (IBAction)itemFinishedEditing:(id)sender {
[sender resignFirstResponder];
UITextField *field = sender;
UITableViewCell *cell = (UITableViewCell *) field.superview.superview.superview;
NSIndexPath *indexPath = [_tableView indexPathForCell:cell];
_list.items[indexPath.row] = field.text;
}
当然,使用 field.superview.superview.superview
可以起作用,但这似乎有些不正规。有没有更优雅的方法?如果我在 cellForRowAtIndexPath
中将 UITextField
的标记设置为其所在单元格的 indexPath.row
,那么即使插入和删除行,该标记是否始终正确?对于那些密切关注的人,你可能认为在那里我有一个多余的 .superview
,对于 iOS6,你是正确的。但是,在 iOS7 中,存在一个额外的视图(NDA 防止我详细说明),位于单元格内容视图和单元格本身之间的层次结构中。这恰好说明了为什么执行 superview 的操作有点不正规,因为它依赖于了解如何实现 UITableViewCell
,并且可能会随着操作系统的更新而破坏。
reloadData
,只是调用了insertRowsAtIndexPaths:
。如果您只是将可见单元格从屏幕的一个部分重新排序到另一个可见屏幕的部分,以便没有单元格进入或离开屏幕,则根本不会调用cellForRowAtIndexPath:
。同样,这假定您没有调用reloadData
。 - rmaddyself.bounds.origin
应该是field.bounds.origin
。我试图编辑你的答案,但 SO 不允许我做出这样小的更改。 - mluisbrown