1

私は本当に言葉を失っています:

DDLogVerbose(@"%@", ([SO2Settings settings].drawMode & SO2DrawModeEraser) ? @"YES" : @"NO");
kMenu.eraserButton.selected = ([SO2Settings settings].drawMode & SO2DrawModeEraser);
DDLogVerbose(@"%@", kMenu.eraserButton);
DDLogVerbose(@"%@", kMenu.eraserButton.selected ? @"YES" : @"NO");

この出力を生成します

詳細 2012-08-05 16:21:05.391 | はい
詳細 2012-08-05 16:21:05.391 | < UIButton: 0x6cfa380; フレーム = (187 10; 59 59); 不透明 = いいえ; タグ = 3; レイヤー = < CALayer: 0x6c37cc0>>
詳細 2012-08-05 16:21:05.391 | いいえ

明らかに、 の値は であるselected 必要がありますがYES、これはNO...ここで何が起こっているのでしょうか?

WEIRD UPDATE : 以下のコードは非常に不安な結果をもたらします:

UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
btn.selected = 8;
btn.enabled = 8;
NSLog(@"Button is selected : %@, Button is enabled : %@", btn.selected ? @"YES" : @"NO", btn.enabled ? @"YES" : @"NO");

ボタンが選択されている:いいえ、ボタンが有効になっている:はい

最終更新:BOOL実際にはsigned char. ただし、有効にされているのに選択されていない理由はわかっていると思います。ヘッダーでUIControlは、 のような領域を持つビットフィールドselected(1 ビット フィールド) を使用しているように見えます。奇数なら正常に動作しますが、偶数では正常に動作しません。したがって、挿入するときの数値は 0 または 1 で なければなりません。enabledは実際のBOOLプロパティであり、おそらくsigned char1 ビット フィールドではなく として格納されます。

4

2 に答える 2

1

これは、ブール値の YES または NO をボタンに割り当てていません。

kMenu.eraserButton.selected = ([SO2Settings settings].drawMode & SO2DrawModeEraser);

ビット演算の結果をボタンに割り当てています。したがって、([SO2Settings settings].drawMode & SO2DrawModeEraser) はゼロまたはゼロ以外の値です。ゼロ値の場合、ブール値 NO も 0 として機能します。ただし、1 に等しくないゼロ以外の値の場合、ブール値 YES (1 に等しい) と同じではありません。テストではブール値の結果が得られますが、値の割り当ては異なります。

例えば:

int x = 2;
BOOL y;
...
if(x == 2)
    y = YES;

と同じではありません

y = x;    /* x is 2 */

ゼロ以外の結果 (ブール値ではない) をチェックし、ボタンにブール値の YES を返す次の行を使用する必要があります。

kMenu.eraserButton.selected = ([SO2Settings settings].drawMode & SO2DrawModeEraser)? YES : NO;

または、これを使用するつもりですか:

kMenu.eraserButton.selected = ([SO2Settings settings].drawMode && SO2DrawModeEraser);

ビットごとの AND ではなく、論理 AND の "&&" に注意してください。

于 2012-08-05T07:52:25.657 に答える
0

これはばかげているかもしれませんが、念のために言っておきます。最初の行では、オブジェクトが初期化されているかどうかを確認しているだけではありませんか?

NSString *st = [NSString stringWithFormat:@"something"];
NSLog(@"%@",st ? @"YES":@"NO");

...まだ印刷されますYESが、その値がYESであることを意味するわけではありません.
チェックしてるだけ。

于 2012-08-05T07:39:48.087 に答える