You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:57:02