textLabel
あるコントローラークラスから別のコントローラークラスへのKey-Valueコーディング/監視を使用します。KVCに準拠している場合UITableViewCell
は、そのプロパティにオブザーバーを登録することでKVOを無料で入手できtext
ます(私はiOSではなくMacOSを使用しているため、これが当てはまるかどうかはわかりません)。そうでない場合は、テキストを設定する前に[self willChangeValueForKey:]
、セルのテキストをシャドウイングするいくつかのキープロパティを呼び出し、その後でを呼び出します[self didChangeValueForKey:]
。他のクラスが最初のコントローラークラスにオブザーバーを設定していると仮定すると、observeValueForKeyPath:
通知が届きます。
更新:説明の要求に応じて。
私には2つのクラスがFoo
ありBar
ます。Foo
プロパティ(つまりインスタンス変数)がBar
変更されたときに通知を受け取りたいです。適切な方法で記述されている場合Bar
は、Key-Valueコーディングに準拠します。これは、そのプロパティが、エンコードされた文字列表現である、いわゆるキーパスを介してアクセスできることを意味します。Bar
それが次のように宣言されているとしましょう:
.h
@interface Bar : public NSObject
@property (assign,readwrite) NSInteger x;
@end
.m
#import "Bar.h"
@implementation Bar
@synthesize x;
...
@end
@property
と宣言の組み合わせにより、と@synthesize
と呼ばれるgetterメソッドとsetterメソッドのペアが自動的に生成されx
ますsetX
。これを行った場合は、x
KVCを使用してアクセスできます。クラスは次のようなことを行うことができます。
Bar *bar=[[Bar alloc] init];
NSInteger barX=[bar valueForKey:@"x"];
[bar setValue:2 forKeyPath:@"x"]; // really needs an NSNumber wrapper object
KVCに準拠しているクラスは、Key-Value監視(KVO)に準拠している可能性があるため、これは目的に役立ちます。KVOを実装するには、監視対象addObserver:forKeyPath:options:context:
のオブジェクトにメソッドを呼び出し、監視を実行するオブジェクトにメソッドを実装しobserveValueforKeyPath:ofObject:change:context:
ます。したがって、クラスのインスタンスが変更のインスタンスのプロパティFoo
ごとに通知されるようにするには、次のようなことを行うことができます。x
Bar
Foo *foo=[[Foo alloc] init];
Bar *bar=[[Bar alloc] init];
[bar addObserver:foo forKeyPath:@"x" options:NSKeyValueObservingOptionNew
context:NULL];
クラスの実装ではFoo
、オブザーバーメソッドをオーバーライドします
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context
{
if[keyPath isEqualToString:@"x"]
{
// extract new value from change dictionary
}
}
メッセージを使用してプロパティをbar
変更するたびに、のメソッドに送信されます。KVOをトリガーするには、setterメソッドを使用する必要があることに注意してください。インスタンスメソッド内で単に言うだけでは十分ではありません。x
[self setX:<new value>]
observeValueForKeyPath:
foo
x=2;
NSObject
これらはすべて、 (またはiOSと同等の)実装の一部として無料で提供されます。ドキュメントはAppleの開発者サイトから入手できます。これらは、KeyValueCodingプログラミングガイドとKeyValueObservingプログラミングガイドです。