2010-12-06 3 views
14

なぜ以下のコードが動作ん:UIButtonのsetTitle:forState:質問

[signInBtn setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted]; 
[signInBtn setTitleColor:[UIColor blackColor] forState:UIControlStateDisabled]; 

、これはそうではない:forState::メソッドのみ知らUIControlStateとあなたを受け入れることができ

[signInBtn setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted|UIControlStateDisabled]; 
+0

うわー、それはうまくいかないようです。 +1 – BoltClock

+2

メソッド名には、単なる '状態:' not: 'states:'ではないことに注意してください。 – Jasarien

+5

@Jasarienビットマスクを使用しないでください。 – bioffe

答えて

29

これは古い質問ですが、これらの回答は正しくありません。あなたは個別に設定すると

あなたはstateプロパティは、あなたが一緒にビット単位のORそれらときあなたは、彼らがstateプロパティに設定する必要がありますBOTH明記されているUIControlStateHighlighted OR UIControlStateDisabledではなく、両方

べきであると言っています。意味UIControlStateHighlightedおよびUIControlStateDisabledstateプロパティで設定されます。

以下のサンプルコードは、私の要点を完全に示しています。あなたがそれに同意しない場合は、それを自分で実行してください。

[button setTitle:@"highlighted and selected" forState:UIControlStateHighlighted | UIControlStateSelected]; 
[button setTitle:@"Highlighted only" forState:UIControlStateHighlighted]; 
[button setTitle:@"Selected only" forState:UIControlStateSelected]; 
[button setTitle:@"Normal" forState:UIControlStateNormal]; 

NSLog(@"Normal title: %@", [[button titleLabel] text]); // prints title: Normal 

[button setSelected:YES]; 

NSLog(@"Selected title: %@", [[button titleLabel] text]); // prints title: Selected only 

[button setSelected:NO]; 
[button setHighlighted:YES]; 

NSLog(@"highlighted title: %@", [[button titleLabel] text]); // prints title: Highlighted only 

[button setSelected:YES]; 

NSLog(@"highlighted and selected title: %@", [[button titleLabel] text]); // prints title: highlighted and selected 
+0

全く同意しない。各ビットが状態を表すマスクがあります。個別に設定されている場合は、ビット単位のORを使用します。それを確認するために、常にマスク値を取得できます。なぜそれは私の理解を超えて、ワンショットで設定できないのですか? – bioffe

+0

マスク値を取得して、上記2つの呼び出しの制御状態をビット単位で論理和していることを確認するにはどうすればよいですか? –

+4

@bioffer:あなたは間違っている、パトリックは正しい。 'setTitle:forState:'を呼び出すたびに、ボタン内に追加のタイトルが設定され、その特定のマスクの組み合わせに割り当てられます。マスクの組み合わせが存在しない場合は、UIControlStateNormalマスクのタイトルセットに戻ります。たとえば、Patrickの例で最初の行をコメントすると、最後の 'NSLog()'は強調表示され、選択されたtitle:normal "'を出力します。これは、ボタンが強調表示され選択されたときのタイトルを設定していないためです。 –

2

setTitleColorがあるので2つのUIControlState値をOR演算します。

各UIControlStateは、(低いレベルで)最も単純な整数定数です。

更新:

それが動作しないということではなく、より奇なりビットマスク、ですが、私のポイントはまだ立っています。 (片側に驚くほど傾いていて危険ですが)。

+1

['UIControlState'はビットマスクです。](http://developer.apple.com/library/ios/documentation/uikit/reference/UIControl_Class/Reference/Reference.html#//apple_ref/c/tdef/UIControlState) – BoltClock

+0

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIControl_Class/Reference/Reference.html%23//apple_ref/c/tdef/UIControlState – vikingosegundo

+0

私の悪いです。それはうまくいきません。 (おそらく、既知の定数と比較するだけで、どのビットがセットされているかはチェックされていないでしょう) –

-1

バグかもしれません。ビットマスクを予期しない値、例えばUIControlStateHighlighted & UIControlStateDisabledに変更して、すべての状態の色を同じにしてください。