1

我正在做斯坦福课程作业,他发布了这段代码 UIControlStateSelected|UIControlStateDisabled 这到底是什么意思,| 是什么意思?操作数呢?

另外,我正在尝试使用此代码在按钮上设置值,但它不起作用,有什么帮助吗?

if(!sender.isSelected){
        [sender setTitle:self.deck.drawRandomCard.contents forState:UIControlStateSelected];
    } else {
        [sender setTitle:@"" forState:UIControlStateDisabled];
    }
4

2 回答 2

3

按钮有许多表示为枚举值的状态。您在这里拥有的只是其中两个:

UIControlStateSelected|UIControlStateDisabled

整个列表在UIControl.h

typedef NS_OPTIONS(NSUInteger, UIControlState) {
    UIControlStateNormal       = 0,
    UIControlStateHighlighted  = 1 << 0,      // used when UIControl isHighlighted is set
    UIControlStateDisabled     = 1 << 1,
    UIControlStateSelected     = 1 << 2,      // flag usable by app (see below)
    UIControlStateApplication  = 0x00FF0000,  // additional flags available for application use
    UIControlStateReserved     = 0xFF000000   // flags reserved for internal framework use
};

那么这是什么意思?正如您在枚举定义中所见,设置为枚举的值是每个值的单个设置位。所以,这里是上面的二进制表示:

1 << 0 = 0000 0001 b
1 << 1 = 0000 0010 b
.. and so on

如您所见,<<是一个移位运算符,我们只是将位向左移动,以便我们可以将这些枚举组合到一个变量中!我是什么意思?这里:

0000 0011 b // This is essentially two flags set, on for the highlighted state one for the disabled

因此,我们通常使用按位 OR 运算符来组合这些标志:

0000 0001 | 0000 0010 = 0000 0011

最后,当组合这些标志并将它们发送到设置标题的方法时,您是在告诉底层实现在单个方法调用中更改这两个选项的标题。

...

至于您关于不起作用的代码的第二个问题,描述“不起作用”的含义会很有用。它会崩溃吗?您正在寻找的期望输出是什么?


编辑:

我刚刚阅读了评论,这个答案似乎还需要解决一些问题:

为了务实地改变按钮的状态,你应该调用类似的东西:

[sender setEnabled:NO];

您刚刚编写的代码告诉按钮在更改为禁用状态后显示该文本。

关于运算符的另一个问题||,当然是 OR 运算,而不是按位 OR。此运算符用于布尔表达式而不是按位运算。

于 2013-06-09T09:51:28.737 回答
-1

是什么 | 意思是(对于 UIButton 状态的情况)?

这意味着在同时选择和禁用按钮时应用该属性。

| 据我所知,运算符表示按位或。但不知何故,当您将 UIControlState 按位或在一起时,必须同时满足它们才能产生效果。是的,这很奇怪,但根据我的经验,这就是它目前的行为方式。

看看这里的另一个答案,这表明它的行为也像我所说的那样:UIButton setTitle:forState: question

因此,例如,当用户突出显示最初选择的按钮时,您可以为该 UIControlStateHighlighted|UIControlStateSelected 状态应用特定标题。

现在关于您的代码不起作用的内容:

您的代码只是在选择按钮时设置按钮的标题(或为 else 块禁用),但这并不意味着它将使按钮被选中(或禁用)。

您需要选择(或禁用)按钮属性以查看发生的标题更改。

这些属性,例如启用、选择、突出显示,可以通过手指触摸来触发,或者您也可以通过编程方式设置这些属性。看看UIControl 的类参考,其中包括列出的那些属性。

例如:

myButton.enabled = NO;
myButton.highlighted = YES;
myButton.selected = YES;
于 2013-06-09T01:23:23.987 回答