2

假设我有一个UITableViewUITextField单元格对应的模型对象的属性。并假设我想对单元格进行 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];
}
4

0 回答 0