6

According to Ensuring KVC Compliance,

For properties that are an attribute or a to-one relationship, this requires that your class:

  • Implement a method named -<key>, -is<Key>, or have an instance variable <key> or _<key>.

What is the best way to add observers to "FAKE" properties like the following?

@property (nonatomic, readonly) BOOL shortlisted; 

#pragma mark - Fake properties

- (BOOL)shortlisted
{
    return [self.provider isJobShortlisted:self];
}   
4

1 に答える 1

14

依存キー

同じオブジェクトの別のキーに依存する 1 つのキーがあるだけの場合は、オーバーライドできます+keyPathsForValuesAffectingValueForKey:。(よくある落とし穴については、この記事も参照してください。)

KVO のドキュメントには、他のオブジェクトに依存するキーに関する情報がありますが、残念ながら、これは OS X (iOS ではなく) でのみサポートされているようです。

手動通知

完全なカスタム プロパティを実装している場合は、KVO ドキュメントの手動変更通知に関するセクションに必要な情報がすべて記載されています。キーポイントは次のとおりです(ドキュメントからの引用あり):

  • 手動通知を実装するクラスは、 の NSObject 実装をオーバーライドする必要がありますautomaticallyNotifiesObserversForKey:。... 手動通知を実行するプロパティの場合、 のサブクラス実装はautomaticallyNotifiesObserversForKey:を返す必要がありNOます。

  • 手動オブザーバー通知を実装 willChangeValueForKey:するには、値を変更する前と値をdidChangeValueForKey:変更した後に呼び出します。

    (複数のプロパティを変更する場合は、これらの呼び出しをネストできます。)

  • 順序付けられた対多関係の場合、変更されたキーだけでなく、変更のタイプと関連するオブジェクトのインデックスも指定する必要があります。

    これには、メソッドwillChange:valuesAtIndexes:forKey:とを使用しますdidChange:valuesAtIndexes:forKey:

于 2012-04-06T11:09:08.940 に答える