【问题标题】:UIControlStateSelected|UIControlStateDisabled, Objective C ExplanationUIControlStateSelected|UIControlStateDisabled,Objective C 解释
【发布时间】:2013-06-09 00:37:47
【问题描述】:

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

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

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

【问题讨论】:

  • Objective-C 是 C 的超集。| 运算符是 C 中的“按位或”运算符。快速搜索一下看看它的作用。

标签: objective-c ios6 cs193p


【解决方案1】:

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

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

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

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

所以,我们通常使用按位或运算符来组合这些标志:

0000 0001 | 0000 0010 = 0000 0011

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

...

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


编辑:

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

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

[sender setEnabled:NO];

您刚才的代码告诉按钮在它变为禁用状态后显示该文本。

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    现在关于你的代码不起作用的地方:

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

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

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

    例如:

    myButton.enabled = NO;
    myButton.highlighted = YES;
    myButton.selected = YES;
    

    【讨论】:

    • | 运算符是“按位或”运算符。这并不意味着“同时”。
    • @rmaddy。谢谢。更新了我的答案。
    • 如何选择或禁用按钮属性?我认为如果我在应用程序运行时在视图中单击它会被选中?也不会|| be 和 OR 操作数还是只存在于 C 语言中?
    • @user2076774 |是按位或,但似乎是 UIButton 状态的错误。在这里找到的答案也说明了:stackoverflow.com/questions/4370466/… 并且也基于我自己的编码经验。您可以尝试自己运行代码。
    • @rmaddy 它是“位或”运算符,但它确实意味着“同时”。至少对于 UIButton。
    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2010-10-01
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多