1

これはXcodeのInterface Builderで私の状況であるにNSButton有効状態をバインドする方法:合成条件

IB situation

また、NSTableViewの内容を制御するエンティティモードでNSArrayControllerはあります。 NSSearchField内のテキストが空でない場合、NSTableViewが空の場合(NSSearchFieldによって制御される場合)およびの場合、「作成」ボタンを有効にしたいです。どのように達成するのですか?プログラミングなしで可能ですか?

「作成」ボタンの2つの有効条件をバインドするKVO準拠の値はどれですか?

答えて

2

私はインターフェイスビルダーで完全にそれを行う方法はないと思いますが、少量のコードでかなり簡単に作業できるようになります。まず、コントローラ(またはApp Delegate)が検索フィールドのデリゲートとして設定され、IBOutletが検索フィールド、ボタン、および配列コントローラに接続されていることを確認します。ここで私はそれを実装する方法をです:あなたはそれのいくつかは、ギリシャのように見えるかもしれbindingへの新しいしている場合

// This is an arbitrary pointer to indicate which property has changed. 
void *kObjectsChangedContext = &kObjectsChangedContext; 

- (void)awakeFromNib { 

    // Register as an observer so we're notified when the objects change, and initially at startup. 
    [arrayController addObserver:self 
         forKeyPath:@"arrangedObjects" 
         options:NSKeyValueObservingOptionInitial 
         context:kObjectsChangedContext]; 
} 

// This updates the button state (based on your specs) 
- (void)updateButton { 

    BOOL canCreate = (searchField.stringValue.length > 0 && 
         0 == [arrayController.arrangedObjects count]); 
    [createButton setEnabled:canCreate]; 
} 

// This delegate method is called whenever the text changes; Update the button. 
- (void)controlTextDidChange:(NSNotification *)obj { 
    [self updateButton]; 
} 

// Here's where we get our KVO notifications; Update the button. 
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 

    if (kObjectsChangedContext == context) 
     [self updateButton]; 

    // It's good practice to pass on any notifications we're not registered for. 
    else { 
     [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
    } 
} 

、うまくいけば、コメントが十分に明確です。

+0

フランシスは、これは非常にいいです、直接使用することができ、非常によく文書化されています。それは私にとってはあまりギリシャ語ではありませんが、あなたが今私のためにしたコーディングを避けることを望んでいました;)誰も次の3日間で宣言的な解決策を思い出さなければ、答えとしてマークします。どうもありがとう! –

2

私はこのためにSOOOですが、別の方法を考え出し、アプリでテストしました。それはうまくいくので、私は将来この問題を見つける人のために共有しようと思っています。

基本的にはあなたが何をしたいかは、あなたのコントローラに対応する値のないプロパティを作成することです

 @property (readonly) BOOL enableProperty; 

これがヘッダファイルで定義された

BOOL enableProperty; 

が実際にいない、または任意の場所にあることを意味

それを合成するのではなく、自分のゲッターを書いて、あなたの状態を入れてください。

- (BOOL) enableProperty{ 
     return (condition); 
    } 

第3ステップ:いつでもあなたの状態が変化する可能性があることを通知します。

- (void) someMethod{ 
     //.... Some code 
     [self willChangeValueForKey:@"enableProperty"]; 
     [Thisline mightChange:theCondition]; 
     [self didChangeValueForKey:@"enableProperty"]; 
     //.... Some other code 
    } 

第4ステップ:IBでは、コントロールのenabledプロパティをこの「偽」プロパティにバインドします。

お楽しみください! ;)

1

おそらく、あなたはNIBファイルのファイルの所有者として設定されているコントローラオブジェクトを持っているようです。

このコントローラークラスでブール値プロパティを宣言しないと、条件に応じて値が返されます。

@property(readonly) BOOL canCreate; 

あなたが実装することを:

-(BOOL)canCreate { 
    // compute and return the value 
} 

適切にKVO通知を送信するようにしてください時に作成変更のための条件。
最後の手順は、ボタンのenabledバインディングをFile OwnerのcanCreateキーにバインドすることです。