在UIButton类中未调用委托方法



我有一个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
}
}

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

  1. 如果创建了一个委托,则需要在某个地方符合该委托
  2. 一致性类应该分配给委托的实例

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

首先是设置屏幕:

protocol SettingScreenDelegate: class {
func settingSetButtonConstraints()
}
class SettingScreenVC {
weak var delegate: SettingScreenDelegate?
func closeSettings() {
delegate?.settingSetButtonConstraints()
}
}

到目前为止,主屏幕应该符合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
}
}

您需要为委托变量赋值。如果答案总是self,我会这样做

class Example: SomeDelegate {
lazy var someDelegate: SomeDelegate? = self
}

否则,您将希望在类的初始值设定项或ViewDidLoad中执行此操作。

最新更新