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......这里发生了什么?

奇怪的更新:下面的代码产生了一个非常令人不安的结果:

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属性,可能存储为 asigned char而不是 1 位字段。

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);

注意逻辑与而不是按位与的“&&”。

于 2012-08-05T07:52:25.657 回答
0

这可能是愚蠢的,但我会说它只是为了确定:在第一行中,您不只是检查对象是否已初始化吗?

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

...仍会打印YES,但这并不意味着它的值为 YES。
只是检查。

于 2012-08-05T07:39:48.087 回答