2012-08-05 90 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

相关问题