4

私のインターフェイスには、valueのユーザーがNSTextFieldNSArrayController'sselection.selectedType.titleにバインドされています。 NSArrayController'sオブジェクトのすべてのカスタムは、二つの方法で各オブジェクトされていますKVO:オブザーバを削除できません

- (MYType *)selectedType; 
- (void)setSelectedType: (MYType *)type; 

はIVAR selectedTypeを持っていません。しかし、それらは全てMYTypeのオブジェクトを保持するiVarを持っています。コードはこれに沸く:

- (MYType *)selectedType 
{ 
    if (someIndex == 0) 
     return [types objectAtIndex: 0]; 
    else 
     return [self typeWithIndex: someIndex]; 
} 

- (void)setSelectedType: (MYType *)type 
{ 
    someIndex = [type index]; 
} 

MYTypeオブジェクトは、対応する@propertysynthesizeNSString *title IVARを得ました。

私はsetSelectedType:を呼び出すたびに、変更がNSTextFieldにすぐに表示され、すべてが動作しているようですが、私は言って、ログメッセージを取得:

キー パス「selectedTypeのためのオブザーバーNSArrayControllerはの0x141160を削除することはできませんが。キータイプ「selectedType」の値が に変更されたため、適切なKVO通知を送信せずに、おそらく がMYType 0x1a4830から「タイトル」に変更されました。 MYTypeクラスの KVO準拠を確認してください。

は私がwillChangeValueForKey:didChangeValueForKey:setSelectedType:方法をカプセル化しようとしたし、私はまだ、ログメッセージが異なる1つを得た:

キー パス「タイトル」からのためにオブザーバーNSKeyValueObservance 0x1c7570を削除することはできませんMYType 0x1a4be0は オブザーバとして登録されていないためです。

答えて

5

まず、アクセサを使用してください。あなたのivarsに直接アクセスしないでください。あなたはiVarを直接修正するので、someIndexのKVOをバイパスしています。あなたがする必要がない限り、直接ivarsに触れないでください。

また、selectedTypesomeIndex(および/またはsomeStuff;あなたの蒸留コードからは明らかではありません)に依存していることをKVOに知らせる必要があります。

+ (NSSet *)keyPathsForValuesAffectingSelectedType 
{ 
    return [NSSet setWithObjects:@"someIndex", nil]; 
} 

これはsomeIndex変更は、それがselectedTypeで暗黙的変化を起こすたびKVOシステムに指示します。 Registering Dependent Keysを参照してください。

0

この同じエラーが発生しましたが、別の理由があります。他の誰かがここに巻き込まれた場合にそれを言及する価値があるでしょう。

私はSwiftにアプリを書いていますが、varのプレフィックスを忘れてしまいました

関連する問題