2

モデル オブジェクトのプロパティに対応するUITableViewwithセルがあるとします。UITextFieldそして、それに応じてモデルを同期するためにセルを KVO したいとし
ます (OS X のバインドを介して行うことができるように)。

これを行う適切な(バニラ)方法は何ですか?
(私はview-> controller->model方向について話している。他の方向は明らかだ。)

現在、ビューコントローラーをフィールドとして設定し、次の場所で一意の( 'd)タグdelegateを割り当てています。enum

- (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