Swift中函数运行时如何禁用触发该函数的按钮?
报错原因
你当前为@IBAction方法命名为了Button,当你调用Button.isEnabled = false时,系统会将Button识别为你定义的这个点击方法本身,而非按钮实例对象,因此才会抛出AppDelegate不存在isEnabled成员的错误。
解决方案
你可以直接用点击方法自带的sender参数,它就是触发本次点击的按钮实例,不需要额外调用其他变量:
场景1:按钮点击绑定的是同步执行的逻辑
直接用defer语句保证无论函数执行流程如何,结束时都会自动恢复按钮可用状态,不会出现逻辑遗漏导致按钮永久禁用:
@IBAction func Button(_ sender: NSButton) { // 点击后立刻禁用按钮 sender.isEnabled = false defer { // 函数执行完成前自动恢复按钮可用 sender.isEnabled = true } // 原有业务逻辑 // blablabla }
场景2:按钮点击绑定的是异步执行的逻辑(如网络请求、耗时任务)
此时defer会随函数立刻执行,无法等到异步任务结束,需要在异步任务的回调末尾手动恢复按钮状态,注意UI修改必须回到主队列执行:
@IBAction func Button(_ sender: NSButton) { sender.isEnabled = false // 示例:异步执行耗时任务 DispatchQueue.global().async { // 执行你的异步业务逻辑 // blablabla // 任务结束后回到主队列恢复按钮 DispatchQueue.main.async { sender.isEnabled = true } } }
补充建议
如果需要在点击方法之外的其他地方也能控制该按钮状态,可以给按钮绑定一个单独的IBOutlet属性,注意属性名不要和现有的IBAction方法重名即可:
// 绑定对应按钮的IBOutlet @IBOutlet weak var operationButton: NSButton! // 之后在任意位置都可以直接控制状态 operationButton.isEnabled = false
内容的提问来源于stack exchange,提问作者darkskymakesmesad
相关产品推荐
相关产品推荐

