設定の 2 つのブール値に応じて、インターフェイス ビルダーでコントロールのプロパティ Enabled を設定する必要があります。
ただし、演算子は AND ではなく OR にする必要があります。2 つのうちの 1 つが true の場合、私のコントロールを有効にする必要があります。
現在、AND 演算子でのみ機能させることができます (スクリーンショットを参照)。
ありがとう
設定の 2 つのブール値に応じて、インターフェイス ビルダーでコントロールのプロパティ Enabled を設定する必要があります。
ただし、演算子は AND ではなく OR にする必要があります。2 つのうちの 1 つが true の場合、私のコントロールを有効にする必要があります。
現在、AND 演算子でのみ機能させることができます (スクリーンショットを参照)。
ありがとう
残念ながら、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
ます。
この方法でそれを行うことができます:
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:
NSNegateBoolean
IB のValueTransformer を変更します。両方の IBActionで私の 2 行self.isTextFieldVisible=!self.isTextFieldVisible;
が不要になるようにします。