为什么我的UIButton所选属性设置不正确?

时间:2012-08-05 07:28:05

标签: objective-c ios

我真的不知所措:

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位字段。

2 个答案:

答案 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 只是检查。