2012-08-05 55 views
1

我真的在失去了言語:爲什麼我的UIButton的選定屬性設置不正確?

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 |是
Verbose 2012-08-05 16:21:05.391 | < UIButton:0x6cfa380; frame =(187 10; 59 59); opaque = NO; tag = 3;層= < CALayer:0x6c37cc0 >>
Verbose 2012-08-05 16:21:05.391 | NO

顯然,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"); 

按鈕:NO,按鈕被使能:YES

LAST UPDATE:忘記關於C標準的事情,因爲BOOL實際上是signed char。不過,我想我知道啓用作品的原因,但選擇不了。在標題中,看起來UIControl使用具有諸如selected(這是1位字段)的區域。如果它是一個奇數,它可以正常工作,但偶數不會。所以插入時必須爲爲0或1。 enabled是一個實際的BOOL屬性,可能存儲爲signed char而不是1位字段。

+0

有趣的相關閱讀:[BOOL的尖角](http://weblog.bignerdranch.com/564-bools-sharp-corners/),在BNR博客。 – 2012-08-05 18:06:38

+0

@JoshCaswell謝謝,我已經找到了我的路!它很有意思。 – borrrden 2012-08-05 18:07:11

回答

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; 

或者做u打算用這個:

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

注意 「& &」 的,而不是按位與邏輯與。

+0

那怎麼樣!我一直認爲0等於假,非0等於真。在上面的行中,您將表達式測試爲'BOOL',那麼爲什麼不能將結果用作'BOOL'?這就是我真正想知道的。然而,它確實解決了它,所以我會接受這個答案(儘管如此,仍然會有人解釋上述後續問題)。 – borrrden 2012-08-05 08:39:25

+0

你指的是哪一行? – Rick 2012-08-05 08:55:55

+0

This one - >([SO2Settings settings] .drawMode&SO2DrawModeEraser)? YES:NO另外,在一個有趣的發展中,這個代碼**的作品**是我設置eraserButton.enabled而不是eraserButton.selected。如果我先將結果轉換爲c樣式的布爾(但不是obj-c BOOL),它也可以工作。 – borrrden 2012-08-05 08:57:06

0

這可能是愚蠢的,但我會說只是爲了確保: 在第一行不是你只是檢查對象是否被初始化?

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

...仍然會打印YES但它並不意味着它的值爲YES。
只是檢查。

+0

如果第一行未初始化,那麼drawMode將爲0,並且它將評估爲「否」。設置是一個共享對象,並通過應用程序存活(在這種情況下,它返回8)。無論如何,問題在於它返回'YES',但不知何故'selected'仍然是'NO'。 – borrrden 2012-08-05 07:44:16

相關問題