1

設定の 2 つのブール値に応じて、インターフェイス ビルダーでコントロールのプロパティ Enabled を設定する必要があります。

ただし、演​​算子は AND ではなく OR にする必要があります。2 つのうちの 1 つが true の場合、私のコントロールを有効にする必要があります。

現在、AND 演算子でのみ機能させることができます (スクリーンショットを参照)。

ここに画像の説明を入力

ありがとう

4

2 に答える 2

1

残念ながら、IBでは、とに固執しています。私の提案は、NIBにアクセス可能なオブジェクト(おそらくNIBの所有者)に新しいプロパティを追加することです。これは、コントロール/ビューを有効にするために他のオブジェクトへの変更に依存します。

を使用しているように見えるShared User Defaults Controllerので、所有者で、結合されたユーザーのデフォルト(おそらく)に対して新しいブールプロパティを作成することをお勧めしdownloadingCastOrCrewます。次に、いずれかのデフォルトが変更されたときに、次のことを確認する必要があります。の値を変更しますdownloadingCastOrCrew

インターフェース:

@property BOOL downloadingCastOrCrew;

コントローラーをセットアップしているとき、またはawakeFromNibの後の実装では、次のようになります。

 [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self
      forKeyPath: @"values.kSearchPreferencesDownloadCast"
      options:NSKeyValueObservingOptionNew
      context:NULL];
 [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self
      forKeyPath: @"values.kSearchPreferencesDownloadCrew"
      options:NSKeyValueObservingOptionNew
      context:NULL];

コントローラーを破棄する実装では、次のようになります。[[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:@ "values.kSearchPreferencesDownloadCast"];

 [[NSUserDefaultsController sharedUserDefaultsController] removeObserver: self
      forKeyPath: @"values.kSearchPreferencesDownloadCrew"];

オブザーバーをまだ持っていない場合は、次のように追加します。

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
      change:(NSDictionary *)change context:(void *)context
 {
     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
     self.downloadingCastOrCrew = [defaults boolForKey: @"kSearchPreferencesDownloadCast"] 
         || [defaults boolForKey: @"kSearchPreferencesDownloadCrew"];
 }

アクセサーメソッドを使用すると、kvoがトリガーさdownloadingCastOrCrewれ、NSUserDefaults値の代わりに、コントローラーをブール値として使用して直接チェックできるようになります。

明らかに、すでにobserveValueForKeyPathがある場合は、呼び出しにコンテキスト値を追加して、addObserver:forKeyPath:options:context呼び出しでチェックすることをお勧めしobserveValueForKeyPath:ofObject:change:contextます。

于 2013-03-19T10:14:12.603 に答える
0

この方法でそれを行うことができます:

3 番目のプロパティを作成する

@property BOOL isFirst;
@property BOOL isSecond;

@property BOOL isTextFieldVisible;//this one is your third

- (IBAction)isSec:(id)sender;
- (IBAction)isFir:(id)sender;

実装中

- (id)init
{
    self = [super init];
    if (self) {
        self.isFirst=NO;
        self.isSecond=NO;
    }
    return self;
}

- (IBAction)isSec:(id)sender {
    self.isSecond=!self.isSecond;
    [sender setTitle:[NSString stringWithFormat:@"isSecond: %d",self.isSecond]];

    self.isTextFieldVisible=self.isFirst || self.isSecond;

    self.isTextFieldVisible=!self.isTextFieldVisible;

    NSLog(@"->%d",self.isTextFieldVisible);
}

- (IBAction)isFir:(id)sender {
    self.isFirst=!self.isFirst;
    [sender setTitle:[NSString stringWithFormat:@"isfirst: %d",self.isFirst]];

    self.isTextFieldVisible=self.isFirst || self.isSecond;

     self.isTextFieldVisible=!self.isTextFieldVisible;

    NSLog(@"->%d",self.isTextFieldVisible);
}
@end

バインディングでは、textField を 3 番目のプロパティにバインドするだけです。

ここで実行中のアプリケーションを確認してください。

編集1:

NSNegateBooleanIB のValueTransformer を変更します。両方の IBActionで私の 2 行self.isTextFieldVisible=!self.isTextFieldVisible;が不要になるようにします。

于 2013-03-19T10:42:58.310 に答える