假设我有一个UITableView
与UITextField
单元格对应的模型对象的属性。并假设我想对单元格进行 KVO 以便相应地同步模型
(可以通过 OS X 上的绑定来完成)。
这样做的正确(香草)方法是什么?
(我说的是view
-> controller
->model
方向。其他方向我很清楚。)
目前我将我的视图控制器设置为字段'delegate
并为其分配一个唯一的(enum
'd)标签:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
然后实施:
- (void)textFieldDidEndEditing:(UITextField *)textField {
NSUInteger tag = textField.tag;
switch (tag) {
case SomeTextFieldTag: {
self.foo = textField.text;
break;
}
case SomeOtherTextFieldTag: {
self.bar = textField.text;
break;
}
...
default: {
break;
}
}
}
但这只是不能很好地扩展(关于开发工作/维护)并且感觉笨拙/可疑。
特别是当我滥用标签的时候感觉它们根本不适合(因为将文本字段与模型属性键相关联的簿记应该在控制器方面完成,而不是通过 MVC 视图层上的标签或通过任何其他方式)。
所以我想我可以改为对字段进行适当的 KVO 观察,并为每个字段使用不同的 KVO 上下文,而不是标签。但这感觉不那么可疑(簿记方面),但和以前一样笨拙。就像我只是在解决维护问题。(虽然标签可以动态分配,但在上下文中这样做对我来说有点不对劲。)
来自 OS X 并习惯于在集合视图中绑定,我很惊讶在这件事上没有找到任何所谓的可靠资源。或者也许我只是为了正确搜索而转储?关于这个特定主题的任何官方编程指南,我错过了备忘录?
对于这种所谓的非常常见的场景,一个/被广泛接受的最佳实践是什么?
适当的本地基于块的 KVO 观察将使这变得简单得多。完全不需要簿记:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = ...;
switch (indexPath.row) {
case ...: {
[cell addObserverForKeyPath:@"..." inContext:classContext withBlock:^(id object, NSString *keyPath, NSDictionary *change) {
self.model.foo = changes[NSKeyValueChangeNewKey];
}];
...
break;
}
...
default: {
break;
}
}
...
return cell;
}
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
[cell removeObserverForKeyPath:nil inContext:classContext];
}