0

プロパティといくつかのプロパティを持つUIView サブクラスCustomViewがあります。には、 と の 2 つのプロパティがあります。何かが変更されるたびに、 のさまざまなアウトレットを更新する簡単で拡張可能な方法が必要です。KVO を使用してこれを行う簡単な方法があるはずですが、新しいオブジェクトを に割り当てることができるため、それらの通知を購読することはできません。CustomObject *modelIBOutletCustomObjectNSString *titleNSString *imageNameCustomViewmodelmodel

これを行う 1 つの方法 (以前に使用したことがあります) は、オーバーライド- (void)setModel:(CustomObject *)modelしてレイアウトをやり直し、KVO のそのオブジェクトのキーを再サブスクライブすることです。これは最も合理的な解決策ですか、それとも明らかなことを見落としていますか?

4

3 に答える 3

0

私はあなたの質問を読む前に KVO を提案するつもりだったので、あなたの質問を最後まで読んだら、そうです、まさに KVO の目的です。しかし、私は他の答え(Pinwheelerから)にも同意します-観察を行うのはビューではなく、ビューコントローラーです。

ただし、可能であれば、View Controller がモデルとビューの両方を管理するのがより一般的です。両方を担当しているため、何も観察する必要はありません。モデルを変更したため、モデルが変更されたかどうかがわかります。

于 2013-04-10T02:27:02.307 に答える
0

setModel:私はこれを次のようにオーバーライドして処理します。

- (void)setModel:(Model *)model {
    if (model != _model) {
        [self disconnectFromModel];
        _model = model;
        [self connectToModel];
    }
}

そして、dealloc私も呼び出しますdisconnect

- (void)dealloc {
    [self disconnectFromModel];
}

ではconnect、モデルがある場合はモデルへの接続を確立し、必要に応じてモデル (またはモデルの一部) をサブビューに渡します。例:

- (void)connectToModel {
    if (_model) {
        // Maybe start KVO...
        [_model addObserver:self forKeyPath:@"name"
            options:NSKeyValueObservingOptionInitial context:&MyKVOContext];

        // Or maybe register for notifications...
        nameNotificationObserver = [[NSNotificationCenter defaultCenter]
            addObserverForName:ModelNameDidChangeNotification object:_model queue:nil
            usingBlock:^(NSNotification *note) {
                [self modelNameDidChange];
            }];

        // Maybe pass part of the model down to a subview...
        [self.addressView setModel:model.address];
    }
}

ではdisconnect、 で行ったことを元に戻すだけですconnect

- (void)disconnectFromModel {
    if (_model) {
        [_model removeObserver:self forKeyPath:@"name" context:&MyKVOContext];

        [[NSNotificationCenter defaultCenter] removeObserver:nameNotificationObserver];
        nameNotificationObserver = nil;

        [self.addressView setModel:nil];
    }
}

モデルも監視するサブビューがある場合、モデルの変更は 2 つのパスで発生することに注意してください。まず、ビュー階層全体が古いモデルから切断されます。次に、ビュー階層全体が新しいモデルに接続されます。

于 2013-04-10T03:35:06.513 に答える