5

私が持っているとしましょう:

@property NSNumber* number;

そして、私のコントローラーは観察しています:

- (void)observeValueForKeyPath:(NSString *)keyPath ...
{
    if ([keyPath isEqualToString:@"number"]) ...
}

私の質問は -プロパティの名前をリファクタリングするためのあなたのアプローチはnumber何ですか?

オブザーバー コードで観察されたキーを更新する必要があることは明らかですが、スマート/自動の方法でそれを行うにはどうすればよいでしょうか。

4

4 に答える 4

3

わかりました、私は自分自身に返信します:) 私のソリューションは、Apurv ソリューションと単体テストを組み合わせたものです。

ここにあります:

1MyClass defineで観測されたプロパティごとに:

static NSString* MyClassPropertyNameNumber = @"number";

2- (void)observeValueForKeyPath:(NSString *)keyPath ...実装では、定義済みの NSString のみを使用します

- (void)observeValueForKeyPath:(NSString *)keyPath ...
{
    if ([keyPath isEqualToString:MyClassPropertyNameNumber]) ...
}

3 MyClass オブジェクトがセレクターsetNumber:に応答するかどうかをチェックする単体テストを作成します。number

- (void)testMyClass
{
    SEL numberGetter = NSSelectorFromString(MyClassPropertyNameNumber);
    SEL numberSetter = NSSelectorFromString([NSString stringWithFormat:@"set%@:", MyClassPropertyNameNumber]);
    
    MyClass* testMyClass = [[MyClass alloc] init];
    if (![testMyClass respondsToSelector:numberGetter] || ![testMyClass respondsToSelector:numberSetter])
    {
        STFail(@"%@: %@ property name has changed! Please update your defined property name!", NSStringFromClass([MyClass class]), MyClassPropertyNameNumber);
    }
}

プロパティ名を変更し、定義されたプロパティ名を更新しないと失敗します。

私はそれが誰かに役立つことを願っています:)

于 2013-01-16T15:53:39.543 に答える
3

1 つの方法は、監視されているすべてのプロパティに対して文字列定数を宣言することです。これらの定数をオブザーバーの追加と比較に使用しkeypathます。プロパティの名前を変更するときはいつでも、これらの文字列定数の値を変更する必要があります。

完全な微粒化が可能だとは思いません。

于 2013-01-16T12:59:45.030 に答える
1

監視対象のキー パスごとに変数を定義し、登録時およびオブザーバー ハンドラー メソッドでコンテキストとして使用します。

static void * numberKVO = &numberKVO;
static void * letterKVO = &letterKVO;

...
[self addObserver:self 
       forKeyPath:@"kp.4.number" 
          options:NSKeyValueObservingOptionNew 
          context:numberKVO];
[self addObserver:self 
       forKeyPath:@"kp.4.letter" 
          options:NSKeyValueObservingOptionNew 
          context:letterKVO];   
...

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (context == numberKVO) {
        ...
    } else if (context == letterKVO) {
        ...
    }
}

他に何も変更せずに、プロパティとキー パスを変更できます。

于 2013-01-16T16:09:35.060 に答える