Objective c 为什么';我的UIT按钮';是否正确设置了选定的属性?

Objective c 为什么';我的UIT按钮';是否正确设置了选定的属性?,objective-c,ios,Objective C,Ios,我真是不知所措: DDLogVerbose(@"%@", ([SO2Settings settings].drawMode & SO2DrawModeEraser) ? @"YES" : @"NO"); kMenu.eraserButton.selected = ([SO2Settings settings].drawMode & SO2DrawModeEraser); DDLogVerbose(@"%@", kMenu.eraserButton); DDLogVerbose(@

我真是不知所措:

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-0516:21:05.391 |是
详细内容2012-08-0516:21:05.391 |
详细内容2012-08-05 16:21:05.391 |否

显然,所选
的值应该是
,但它是
…这里发生了什么

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

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
实际上是一个
签名字符
。但是,我想我知道为什么“启用”有效,而“选择”无效。在标题中,似乎
UIControl
使用了一个位字段,该位字段具有所选的
等区域(这是一个1位字段)。如果它是奇数,则正确工作,但偶数则不正确。因此,插入时数字必须为0或1
enabled
是一个实际的
BOOL
属性,可能存储为
signed char
而不是1位字段

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

NSString *st = [NSString stringWithFormat:@"something"];
NSLog(@"%@",st ? @"YES":@"NO");
…仍将打印
YES
,但这并不意味着其值为YES。

只是检查一下。

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

NSString *st = [NSString stringWithFormat:@"something"];
NSLog(@"%@",st ? @"YES":@"NO");
…仍将打印
YES
,但这并不意味着其值为YES。

只需检查。

这不是为按钮指定布尔值“是”或“否”:

kMenu.eraserButton.selected = ([SO2Settings settings].drawMode & SO2DrawModeEraser);
将按位操作的结果分配给按钮。因此,([SO2Settings settings].drawMode&SO2DrawMode橡皮擦)是零值或非零值。对于零值,它将起到布尔值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);

请注意,逻辑AND的“&&”而不是按位AND。

这不是为按钮指定布尔值YES或NO:

kMenu.eraserButton.selected = ([SO2Settings settings].drawMode & SO2DrawModeEraser);
将按位操作的结果分配给按钮。因此,([SO2Settings settings].drawMode&SO2DrawMode橡皮擦)是零值或非零值。对于零值,它将起到布尔值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);

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

如果第一行未初始化,则drawMode将为0,其计算结果将为
NO
。设置是一个共享对象,并且在应用程序中处于活动状态(在本例中,它返回8)。在任何情况下,问题是它正在返回
YES
,但不知何故
selected
仍保留
NO
。如果第一行未初始化,则drawMode将为0,其计算结果将为
NO
。设置是一个共享对象,并且在应用程序中处于活动状态(在本例中,它返回8)。无论如何,问题是它返回的是
YES
,但不知何故
selected
仍然是
NO
。那又如何呢!我一直认为0等于假,非零等于真。在上面的一行中,您将表达式测试为
BOOL
,那么为什么不能将结果用作
BOOL
?这就是我真正想知道的。但是,它确实解决了这个问题,所以我会接受这个答案(不过仍然希望有人解释上面的后续问题)。您指的是哪一行?这一行->([SO2Settings settings].drawMode&SO2DrawMode橡皮擦)?是:否,另外,在一个有趣的开发中,我正在设置橡皮擦按钮.enabled,而不是橡皮擦按钮.selected。如果我首先将结果强制转换为c样式bool(但不是obj-c bool),它也可以工作。是的,这一行适用于任何接受布尔值的接收器。有关解释,请参阅我编辑的答案。我相信我已经找到了为什么“启用”有效,而“选择”无效的原因(请参阅上面我编辑的问题)。似乎selected仅在位字段中使用1位,而enabled使用8位,因为它不在位字段中。因此,如果标量值为偶数,则对于,结果将为
NO
,但由于所选
溢出,奇数将为
YES
<代码>已启用
存储为实际的
BOOL
,因此不会像那样溢出。那又如何呢!我一直认为0等于假,非零等于真。在上面的一行中,您将表达式测试为
BOOL
,那么为什么不能将结果用作
BOOL
?这就是我真正想知道的。但是,它确实解决了这个问题,所以我会接受这个答案(不过仍然希望有人解释上面的后续问题)。您指的是哪一行?这一行->([SO2Settings settings].drawMode&SO2DrawMode橡皮擦)?是:否,另外,在一个有趣的开发中,我正在设置橡皮擦按钮.enabled,而不是橡皮擦按钮.selected。如果我首先将结果强制转换为c样式bool(但不是obj-c bool),它也可以工作。是的,这一行适用于任何接受布尔值的接收器。请参阅我编辑的答案以获取解释。我相信我已经找到了为什么“启用”有效,而“选择”无效的原因