15

myNameクラスで次のような名前のプロパティがありました。

@property (nonatomic, strong) NSString *myName;

myNameプロパティの値が変更されたときに通知を送信する必要があります。

今、私は次のようなことをしています:

- (void)setMyName:(NSString *)name
{
  _myName = name;
  [[NSNotificationCenter defaultCenter] postNotificationName:CHANGE_NOTIFICATION object:nil];
}

iOS にKey-Value Observing のようなものがあることは知っています。しかし、実装方法がわからず、ドキュメント全体を読みましたが、よく理解できませんでした。

カスタムセッターを使用せずに同じものを実装する方法を理解するのを手伝ってください。

4

3 に答える 3

31

これを試して:

MyClass *var = [MyClass new];
[var addObserver:self forKeyPath:@"myName" options:NSKeyValueChangeOldKey context:nil];

実装する

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{

}

このメソッドは、myName プロパティが変更されたときにいつでも呼び出されます

于 2013-02-14T09:57:07.930 に答える
16

- (void)setMyName:(NSString *)name代わりにこれを行う

[self willChangeValueForKey:@"myName"];
_myName = name;
[self didChangeValueForKey:@"myName"];

//this generates the KVO's

リッスンする場所 (viewController) で、viewDidLoad に次の行を追加します。

[w addObserver:self forKeyPath:@"myName" options:NSKeyValueObservingOptionNew context:nil];

//これにより、KVO をリッスンするための viewController を登録します。

また、このメソッドを実装します。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([[change objectForKey:NSKeyValueChangeNewKey] isEqual:[NSNull null]]) {
        return;
    } else {
        //read the change dictionary, and have fun :)
    }
}

// プロパティの値が変更されるたびに、このメソッドが呼び出されます。

于 2013-02-14T09:58:10.887 に答える
7

顧客セッターなしでこれを行うには、プロパティ セッターを合成するだけです。これにより、willChangeValueForKey / didChangeValueForKey へのすべてのサポート呼び出しが作成されます。

@synthesize myName;

次に、ドット構文でプロパティ値を設定します。

self.myName = @"イニゴ モントーヤ"

その後、オブザーバーは KVO 通知を自動的に受け取ります。

(観測対象を解放する前に、オブザーバーを削除する必要があります。)

于 2013-02-14T10:19:43.313 に答える