【问题标题】:Delegate Method is not called in UIButton classUIButton 类中未调用委托方法
【发布时间】:2021-07-23 07:39:12
【问题描述】:

我有一个 UIbutton 类 - 在用户在设置屏幕上进行更改后,我想从中调用“调整约束”方法。我已经创建了一些协议,一切看起来都井井有条,但是在用户关闭设置屏幕后,它没有从子视图 UIButton 调用该方法。

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

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

基本上我有 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 类中声明函数和 UIButton 类委托:

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
    }
}

【问题讨论】:

  • MainVc 中的closeSettings() 是否被调用? ,SettingScreenVC是如何推送/呈现/tabbar的?
  • @GokulG 当 Segue 被解散时
  • 你在哪里设置MainVC中的代理?
  • @Vadian 我只在MainVC中调用delegate我没有在那里设置,我在Button类中设置delegate为self.numButtonDelegate = self,这不正确吗?
  • 您必须将delegate: SettingScreenDelegate? 设置为采用该协议的实例。否则delegate 仍然是nil 并且什么都不会发生。

标签: swift uibutton swift-protocols


【解决方案1】:

好的,关于委托,您需要了解几件事:

  1. 如果您创建一个委托,您需要在某处符合委托。
  2. 应将符合标准的类分配给委托的实例。

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

首先是设置屏幕:

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
    }
}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我有点让它与这个解决方案一起工作,明天我将使用我的问题中的代码确认最终代码 sn-p。
    猜你喜欢
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多