2014-02-15 129 views
-2

我已经浏览了Stack Overflow上的无数问题,所有人都问了同样的问题。你如何以编程方式禁用UIButton?他们都没有正确回答这个问题。我曾尝试:以编程方式禁用UIButton

[myButton setEnabled:NO]; 

self.myButton.enabled = NO; 

[self.myButton setEnabled:NO]; 

和无数其他。没有任何工作。

我声明了按钮,所以在.h文件:

- (IBAction)myButton; 

什么是正确的语法来做到这一点?我试图关闭viewDidLoad中的按钮,以便稍后重新启用它。 (我知道[myButton setEnabled:NO];可以用于通过IBOutlet声明的按钮,但它不适用于通过IBAction声明的按钮。)

+0

建议 - 当表面上看起来明显不起作用时,在运行时验证该变量不是“nil”。 – rmaddy

+1

上周你问过同样的问题吗? http://stackoverflow.com/questions/21637388/how-to-programmatically-disable-enable-a-uibarbuttonitem –

+0

@XuYin这是我第一次真正让按钮正确禁用。这是一个相似但不同的问题。 –

回答

7

如果您执行类似操作,您将知道代码是否正常工作这样的:

if(self.myButton) 
{ 
    [self.myButton setEnabled:NO]; 
} else { 
    NSLog(@"hey look, I forgot to connect the myButton outlet property!"); 
} 

此外,您的按钮应该被声明为 “IBOutlet”,例如:

// I use "weak" here because it's retained/kept by the storyboard/XIB file, although 
// you could also use "strong"... 
@property (weak) IBOutlet UIButton *myButton; 

,需要声明如下动作:

- (IBAction) myButton: (id) sender; 

所有的IBActions都采用“sender”属性。

+0

为什么我不会将该按钮声明为“IBAction”按钮? –

+0

因为“IBAction”是由按钮(或控件)调用的*动作*。 –

+0

@MichaelDautermann仅供参考 - 操作的'sender'参数实际上是可选的。您只需要处理多个按钮的操作。 – rmaddy

1

当我还在学习可可时,我也在为此而苦苦挣扎。

让我试着澄清你已经得到的答案,因为它听起来对你没有意义。

IB中的UI元素故障排除就像排除立体声系统或计算机故障。在立体声系统中,请务必检查电缆。通常问题的原因是不好的联系。

与接口代码类似,原因通常是IBOutlet或IBAction连接断开或缺失。

至于什么IBOutlets和IBActions是:

IBOutlets是连接东西:某种UIView的对象。有时一个插座连接到一个按钮,有时是一个标签,一个文本字段或其他东西。名称“outlet”意味着它用于输出,如在标签或文本字段中显示信息。这就是它被称为IBOutlet的原因。 (虽然你可以有一个IBOutlet连接到UIButton,所以你可以做一些事情,如启用/禁用按钮。)

IBActions是动词。他们告诉一个UIControl对象(就像一个按钮),当事件发生时,它应该执行什么代码(操作方法)。名字中的“动作”一词是您记忆的助记符。

对于您的情况,您希望通过代码启用/禁用按钮。为了做到这一点,你需要一个IBOutlet连接。

您需要在头文件中定义IBOutlet(代码中的插座是套接字,以继续立体声比喻),然后您需要将视图对象(立体声组件)连接到IBOutlet(套接字) 。连接是电缆。如果你没有建立连接,那么IBOutlet(套接字)是空的,并且没有连接任何东西。 (电缆丢失。)

您可以进入IB,选择您的故事板场景,选择您的按钮并显示“连接检查器”。它应该显示一个IBOutlet连接到你的视图控制器。

或者,正如Michael建议的那样,您可以添加一条日志语句以在运行时检查插座连接是否良好。

这有帮助吗?