我有一个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
}
}
好的,关于委托,您需要了解以下几点:
- 如果创建了一个委托,则需要在某个地方符合该委托
- 一致性类应该分配给委托的实例
考虑到这一点,让我们尝试修复代码:
首先是设置屏幕:
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中执行此操作。