Xcode:如何使用 class 从主视图控制器重置所有按钮的状态

Xcode: How do I reset the state of all Buttons from the main view controller using a class

我的按钮有一个 class,按下时会改变颜色,在打开和关闭之间交替。

class KSPickButton: UIButton {

    var isOn = true

    override init(frame: CGRect) {
        super.init(frame: frame)
        initButton()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        initButton()

    }

    func initButton() {
        layer.borderWidth = 2.0
        layer.borderColor = Colors.shanklinGreen.cgColor
        layer.cornerRadius = frame.size.height/2
        backgroundColor = .clear
        setTitleColor(.white, for: .normal)
        addTarget(self, action: #selector(KSPickButton.buttonPressed), for: .touchUpInside)
    }

    @objc func buttonPressed() {
        activateButton(bool: !isOn)
    }

    func activateButton(bool: Bool) {

        isOn = bool

        let color = bool ? .clear : Colors.shanklinGreen
        //let title = bool ? "" : ""
        let titleColor = bool ?  .white: Colors.shanklinBlack

        //setTitle(title, for: .normal)
        setTitleColor(titleColor, for: .normal)
        backgroundColor = color
    }
}

这非常有效。我的主视图控制器上有 20 个按钮,它们按预期在打开和关闭之间切换......然后也许在按下 6 之后,我想将它们全部重置为关闭。我的主视图控制器上有一个重置按钮,但我不知道如何重置它们?

我可以使它们看起来都已重置,但 bool 保持原样...

如何为所有按钮调用此 class 并正确重置它们?

引入了具有 'isOn' 变量的观察者。您可以尝试使用 'KSPickButton' class 中的以下代码片段。之后,您需要从视图控制器(放置按钮的地方)获取所有子视图,并将所有子视图设置为 'isOn' 到 'false'。

class KSPickButton: UIButton {

public var isOn:Bool = true {
didSet {
  handleButtonStateChange()
 }
}

override init(frame: CGRect) {
    super.init(frame: frame)
    initButton()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    initButton()

}

func initButton() {
    layer.borderWidth = 2.0
    layer.borderColor = Colors.shanklinGreen.cgColor
    layer.cornerRadius = frame.size.height/2
    backgroundColor = .clear
    setTitleColor(.white, for: .normal)
    addTarget(self, action: #selector(KSPickButton.buttonPressed), for: .touchUpInside)
}

@objc func buttonPressed() {
    isOn = !isOn
}

func handleButtonStateChange() {
    let color = isOn ? .clear : Colors.shanklinGreen
    let titleColor = isOn ?  .white: Colors.shanklinBlack
    setTitleColor(titleColor, for: .normal)
    backgroundColor = color
}
}

这是您需要在视图控制器中实现的代码片段,如上所述。

class MyVC: UIViewController {
------
------

for subview in view.subviews where subview.isKind(of: KSPickButton.self)&&(subview as? KSPickButton)?.isOn == true {
  (subview as? KSPickButton)?.isOn = false
 }

-----
-----
}