Swift中如何在两个UISwitch均为ON时显示按钮?是否可用代理方法?
实现方案:监听UISwitch状态变化控制按钮显示
首先要说明:UISwitch并没有专门的代理协议,iOS开发中处理这类UIControl子类(比如UISwitch、UIButton)的交互,最常用的方式是监听它的valueChanged事件来响应状态变化。下面给你完整的Swift实现代码,完全匹配你的需求:
步骤1:完善ViewController代码
先确保你已经给按钮添加了IBOutlet(假设你的按钮叫confirmButton),然后在viewDidLoad里完成初始设置和开关的事件绑定:
import UIKit class AskingAuthorizationVC: UIViewController { @IBOutlet weak var locationSwitch: DesignableSwitch! @IBOutlet weak var notificationSwitch: DesignableSwitch! @IBOutlet weak var confirmButton: UIButton! // 你的按钮IBOutlet override func viewDidLoad() { super.viewDidLoad() // 初始设置:按钮隐藏且禁用 confirmButton.isHidden = true confirmButton.isEnabled = false // 给两个开关绑定值变化事件,触发同一个处理方法 locationSwitch.addTarget(self, action: #selector(switchValueChanged(_:)), for: .valueChanged) notificationSwitch.addTarget(self, action: #selector(switchValueChanged(_:)), for: .valueChanged) } // 处理开关状态变化的方法 @objc private func switchValueChanged(_ sender: UISwitch) { // 判断两个开关是否都处于ON状态 let bothSwitchesOn = locationSwitch.isOn && notificationSwitch.isOn // 根据结果设置按钮的状态 confirmButton.isHidden = !bothSwitchesOn confirmButton.isEnabled = bothSwitchesOn } }
额外说明:如果一定要用“代理”模式(自定义实现)
如果你确实想通过代理的方式来实现(虽然原生UISwitch不支持,但可以自定义扩展),可以给你的DesignableSwitch添加自定义代理协议,不过这属于过度设计,除非你有其他扩展需求。这里给个简单示例:
1. 给DesignableSwitch添加自定义代理
class DesignableSwitch: UISwitch { weak var delegate: DesignableSwitchDelegate? override func didMoveToSuperview() { super.didMoveToSuperview() addTarget(self, action: #selector(onValueChanged), for: .valueChanged) } @objc private func onValueChanged() { delegate?.switchValueDidChange(self) } } protocol DesignableSwitchDelegate: AnyObject { func switchValueDidChange(_ switchView: DesignableSwitch) }
2. 在ViewController中遵循代理协议
class AskingAuthorizationVC: UIViewController, DesignableSwitchDelegate { @IBOutlet weak var locationSwitch: DesignableSwitch! @IBOutlet weak var notificationSwitch: DesignableSwitch! @IBOutlet weak var confirmButton: UIButton! override func viewDidLoad() { super.viewDidLoad() confirmButton.isHidden = true confirmButton.isEnabled = false // 设置开关的代理 locationSwitch.delegate = self notificationSwitch.delegate = self } // 实现代理方法 func switchValueDidChange(_ switchView: DesignableSwitch) { let bothSwitchesOn = locationSwitch.isOn && notificationSwitch.isOn confirmButton.isHidden = !bothSwitchesOn confirmButton.isEnabled = bothSwitchesOn } }
不过还是更推荐第一种方式,它更简洁、符合iOS原生开发习惯,不需要额外自定义代理逻辑。
内容的提问来源于stack exchange,提问作者Agung
相关产品推荐
相关产品推荐

