UIButton 中未调用委托方法 class

Delegate Method is not called in UIButton class

我有一个 UIbutton class - 我想在用户在设置屏幕上进行更改后从中调用 'adjust constraints' 方法。我已经创建了一些协议,一切似乎都井井有条,但它没有在用户关闭设置屏幕后从子视图 UIButton 调用方法。

我在这里尝试了其他一些解决方案 - 没有奏效,我认为这可能是因为我正在使用 UIButton class 并且我无法重新实例化它或调用实例化?无论哪种方式,它都不会从委托中调用方法。

使用协议是否是解决此问题的正确方法?如果是,我错过了什么?

基本上我有3个文件;我设置为第一个委托的 MainVC(当用户完成对设置屏幕的更改时,它会从我的 SettingScreenVC 触发):

class MainVC: UIViewController, SettingScreenDelegate {

    weak var numButtonDelegate: Buttons_Numeric?

    func settingSetButtonConstraints() {
        numButtonDelegate?.setupButtonConstraints()
    }
}

然后在我的设置屏幕中,我在用户对其设置进行一些更改后调用MainVC

class MainVC: SettingScreenVC {

    weak var delegate: SettingScreenDelegate?

    func closeSettings() {
        delegate?.settingSetButtonConstraints()
    }

}

然后在我的 Buttons_Numeric class 中声明函数和 UIButton class代表:

protocol numButtonDelegate: class {
    func setupButtonConstraints()
}

class Buttons_Numeric: UIButton, numButtonDelegate {

    weak var numButtonDelegate: Buttons_Numeric?

    required init(coder aDecoder:NSCoder) { super.init(coder: aDecoder)!}

    override init(frame:CGRect) {super.init(frame: frame)
        self.numButtonDelegate = self
        setupButtonConstraints()
    }

    override func awakeFromNib() {
        self.numButtonDelegate = self
        setupButtonConstraints()
    }

    func setupButtonConstraints() {
        //SET UP CONSTRAINTS
    }
}

您需要为委托变量赋值。如果答案总是 self

,我会这样做
class Example: SomeDelegate {
    lazy var someDelegate: SomeDelegate? = self
}

否则,您需要在 class' 初始化程序或 ViewDidLoad 中执行此操作。

好的,关于委托,您需要了解以下几点:

  1. 如果创建委托,则需要在某处符合委托。
  2. 符合要求的 class 应该分配给委托的实例。

考虑到这一点,让我们尝试修复代码:

首先是设置屏幕:

protocol SettingScreenDelegate: class {
    func settingSetButtonConstraints()
}

class SettingScreenVC {
    weak var delegate: SettingScreenDelegate?

    func closeSettings() {
        delegate?.settingSetButtonConstraints()
    }
}

到目前为止一切顺利,现在 mainScreen 应该符合 SettingScreenDelegate 并分配给它的委托:

class MainVC: UIViewController, SettingScreenDelegate {
    
    weak var button: Buttons_Numeric!

    func openSettingsScreen() {
        let settingsScreen = ... // the setting screen instanciation
        settingsScreen.delegate = self // the MainVC
    }

    func settingSetButtonConstraints() {
        self.button.setupButtonConstraints()
    }
}

现在是最后一步,MainVC 应该有一个按钮的实例,然后我们唯一需要做的就是从 MainVC 调用函数 'setupButtonConstraints',这意味着我们不需要委托按钮。

class Buttons_Numeric: UIButton {

    required init(coder aDecoder:NSCoder) { super.init(coder: aDecoder)!}

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

    override func awakeFromNib() {
        setupButtonConstraints()
    }

    func setupButtonConstraints() {
        //SET UP CONSTRAINTS
    }
}