1

私はNSComboBoxを持っています。アクションセレクターを設定しました。ボックスが非表示になると、ユーザーがボックスに触れていなくても、セレクターが起動します。はい、隠す必要があります。

IBOutlet NSComboBox *comboBox;

[comboBox setAction:@selector(onComboBoxSelection:)];

- (void)onComboBoxSelection:(id)sender
{
   NSLog(@"Why does this fire twice");
   //My code doesn't actually set hidden here, it's just for proof while debugging the issue.
   [comboBox setHidden:YES];
}

NSControl を非表示にすると、セレクターが起動するのはなぜですか? それを修正する最良の方法は何ですか?

更新: メソッドをラップして修正しました。しかし、その理由、またはそれを修正する他の方法を理解したいと思います。

- (void)onComboBoxSelection:(id)sender
{
   if(![sender isHidden]{
     NSLog(@"Now only fires once");
     //My code doesn't actually set hidden here, it's just for proof while debugging the issue.
     [comboBox setHidden:YES];
   }
}
4

2 に答える 2

2

ブレークポイントを設定しonComboBoxSelection:、2 回目に呼び出されたときにバックトレースを確認します (btバックトレースを確認するには、デバッガーに入力します)。それは何が起こっているのかを説明します。

コンボ ボックスは、テキスト フィールドとポップアップの両方であり、両方のアクションを起動します。テキスト フィールド アクションは、Return キーを押すか、ファーストレスポンダーを辞任する (別のフィールドへのタブ移動など) ことによって、編集が終了したときに起動されます。

コンボ ボックスを非表示にすると、テキスト フィールドはファーストレスポンダーを辞任し、そのアクションを起動します。

おそらくやりたいことは、コンボボックスの値が実際に変更されたかどうかを確認し、その後でコンボボックスの非表示などに進むことです.

もう 1 つのオプションは、データ バインディングを使用してコンボ ボックスの変更を観察することです。コンボ ボックスvalueをコントローラーのプロパティにバインドします。次に、コントローラーにプロパティ セッターを実装します。

于 2012-12-05T22:12:59.190 に答える
-1

これを試して[comboBox setHidden:1];

于 2012-12-03T19:58:36.660 に答える