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。これを行った場合は、xKVCを使用してアクセスできます。クラスは次のようなことを行うことができます。
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ごとに通知されるようにするには、次のようなことを行うことができます。xBar
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:foox=2;
NSObjectこれらはすべて、 (またはiOSと同等の)実装の一部として無料で提供されます。ドキュメントはAppleの開発者サイトから入手できます。これらは、KeyValueCodingプログラミングガイドとKeyValueObservingプログラミングガイドです。