Swift 4:如何在其他函数中访问IBAction的sender按钮?
嘿,我看了你的问题和代码,这里有几个实用的办法能解决重置游戏时重新启用按钮的问题~
方案一:给按钮添加IBOutlet引用(最推荐)
目前你只能在dealThreeMore(_:)方法里通过sender访问按钮,但要在外部(比如重置游戏的方法)操作它,最稳妥的方式是给按钮加一个IBOutlet属性,把它变成ViewController的成员变量。
具体步骤:
- 在你的
ViewController类里添加这个属性:
@IBOutlet weak var dealThreeMoreButton: UIButton!
- 打开Storyboard/XIB,把这个IBOutlet和你的“发三张牌”按钮关联起来(操作和关联IBAction类似,按住Ctrl从按钮拖到代码里选择IBOutlet即可)。
- 现在你就能在任何方法里直接操作这个按钮了:
- 在
dealThreeMore(_:)里,你可以直接用这个属性代替sender来调用disable(button:):if game.cards.isEmpty { disable(button: dealThreeMoreButton) resetInfoLabel() } - 在你的重置游戏方法里,直接恢复按钮状态:
func resetGame() { // 先执行你的重置逻辑:比如重置game.cards、清空已匹配卡牌、刷新界面等 game.reset() // 假设你有这样的游戏重置方法 // 重新启用按钮并恢复样式 dealThreeMoreButton.isEnabled = true dealThreeMoreButton.backgroundColor = // 这里设置回按钮原本的背景色,比如你初始的按钮颜色 }
- 在
方案二:临时存储按钮引用(无需修改Storyboard)
如果你暂时不想动界面文件,也可以在ViewController里加一个可选属性,在按钮第一次被点击时把sender存起来:
private var dealButtonReference: UIButton? @IBAction func dealThreeMore(_ sender: UIButton) { // 第一次点击时保存按钮引用 if dealButtonReference == nil { dealButtonReference = sender } // 你的原有逻辑代码... if game.cards.isEmpty { disable(button: sender) resetInfoLabel() } }
之后在重置方法里就能通过这个引用恢复按钮:
func resetGame() { // 重置游戏逻辑 game.reset() // 恢复按钮状态 dealButtonReference?.isEnabled = true dealButtonReference?.backgroundColor = // 恢复原背景色 }
不过这个方案有个小缺点:如果用户从来没点击过这个按钮,dealButtonReference会是nil,重置时就没法操作它了,所以还是方案一更可靠。
另外,你可以给disable(button:)配套写一个enable(button:)方法,让代码更整洁:
private func enable(button: UIButton) { button.isEnabled = true button.backgroundColor = // 设置回按钮初始的背景色 }
这样重置时直接调用enable(button: dealThreeMoreButton)就好啦。
内容的提问来源于stack exchange,提问作者Turnipdabeets
相关产品推荐
相关产品推荐

