以编程方式禁用 UIButton [重复]

Posted

技术标签:

【中文标题】以编程方式禁用 UIButton [重复]【英文标题】:Programmatically disabling a UIButton [duplicate] 【发布时间】:2014-02-15 03:56:08 【问题描述】:

我查看了 Stack Overflow 上的无数问题,都问同样的问题。如何以编程方式禁用 UIButton?他们都没有正确回答这个问题。我试过了:

[myButton setEnabled:NO];

self.myButton.enabled = NO;

[self.myButton setEnabled:NO];

还有无数其他人。没有任何工作。

我在.h 文件中这样声明按钮:

- (IBAction)myButton;

执行此操作的正确语法是什么?我正在尝试禁用viewDidLoad 中的按钮,以便以后可以重新启用它。 (我知道[myButton setEnabled:NO]; 适用于通过IBOutlet 声明的按钮,但不适用于通过IBAction 声明的按钮。)

【问题讨论】:

建议 - 当看似显而易见的方法不起作用时,请在运行时验证变量不是 nil 你上周问过同样的问题吗? ***.com/questions/21637388/… @XuYin 这是我第一次真正让按钮正确禁用。这是一个类似但不同的问题。 【参考方案1】:

如果您执行以下操作,您将知道您的代码是否正常工作:

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;

所有 IBAction 都采用“sender”属性。

【讨论】:

我为什么不将按钮声明为IBAction 按钮? 因为“IBAction”是由按钮(或控件)调用的动作 @MichaelDautermann 仅供参考 - 操作的 sender 参数实际上是可选的。只有处理多个按钮的操作才需要它。 对发送者做某事是可选的,但是可以定义一个不采用“(id) sender”参数的有效操作吗? 我创建了一个 UIButton 的 IBOutlet 实例,并将其附加到 UIButton,同时还保留了 IBAction 附加。 [myButton setEnabled:NO]; 起作用了。【参考方案2】:

当我第一次学习 Cocoa 时,我也遇到了这个问题。

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

在 IB 中对 UI 元素进行故障排除就像对立体声系统或计算机进行故障排除一样。在立体声系统中,请始终检查电缆。通常问题的原因是连接不良。

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

关于什么是 IBOutlets 和 IBActions:

IBOutlets 是与事物的连接:某种 UIView 对象。有时一个插座连接到一个按钮,有时它是一个标签、一个文本字段或其他东西。名称“outlet”意味着它用于输出,例如在标签或文本字段中显示信息。这就是它被称为 IBOutlet 的原因。 (虽然您可以与 UIButton 建立 IBOutlet 连接,因此您可以执行启用/禁用按钮等操作。)

IBActions 是动词。它们告诉 UIControl 对象(如按钮)在事件发生时应该执行什么代码(操作方法)。名称中的“行动”一词是您记住这一点的助记符。

在您的情况下,您希望通过代码启用/禁用按钮。为此,您需要与它建立一个 IBOutlet 连接。

您需要在标题中定义 IBOutlet(代码中的插座是套接字,以继续立体类比),然后您需要将视图对象(立体组件)连接到 IBOutlet(套接字)。连接是电缆。如果您不进行连接,则 IBOutlet(套接字)是空的,并且没有连接到任何东西。 (电缆不见了。)

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

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

这有帮助吗?

【讨论】:

以上是关于以编程方式禁用 UIButton [重复]的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式设置 UIButton 的 buttonType [重复]

以编程方式设置 UIButton 文本颜色 [重复]

如何在 Swift 中以编程方式更改 UIButton 状态

即使有约束,UIButton 图像也会自动调整大小

以编程方式禁用密码记忆提示[重复]

以编程方式启用和禁用移动数据的最新更新[重复]