我真的不知所措:
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 | YES
详情2012-08-05 16:21:05.391 | < UIButton:0x6cfa380; frame =(187 10; 59 59); opaque = NO; tag = 3; layer =< CALayer:0x6c37cc0>>
详情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");
选择了按钮:否,按钮启用:是
最后更新:忘记C标准的事情,因为BOOL
实际上是signed char
。但是,我想我知道启用工作的原因,但选择不支持。在标题中,UIControl
似乎使用具有selected
(这是1位字段)等区域的位域。如果它是奇数,它可以正常工作,但偶数不会。所以插入时的数字必须为0或1。 enabled
是一个实际的BOOL
属性,可能存储为signed char
而不是1位字段。
答案 0 :(得分: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 */
你应该使用以下行检查非零结果(不是布尔值)并为按钮返回一个布尔值。
kMenu.eraserButton.selected = ([SO2Settings settings].drawMode & SO2DrawModeEraser)? YES : NO;
或者你的意思是使用它:
kMenu.eraserButton.selected = ([SO2Settings settings].drawMode && SO2DrawModeEraser);
请注意“&&”用于逻辑AND而不是按位AND。
答案 1 :(得分:0)
这可能是愚蠢的,但我会说这只是为了确定: 在第一行不是你只是检查对象是否被初始化?
NSString *st = [NSString stringWithFormat:@"something"];
NSLog(@"%@",st ? @"YES":@"NO");
...仍然会打印YES
,但这并不意味着它的值为YES
只是检查。