假设我有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视图层上的标签或通过任何other means)。
所以我想我可以在字段上执行正确的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];
}