【发布时间】:2020-11-10 04:49:53
【问题描述】:
我有三个超类和两个子类,如下所示:
class BaseLookupViewController {
}
class RetrieveCompletedordersViewController: BaseLookupViewController {
}
class LoginViewController: BaseLookupViewController {
}
在 BaseLookupViewController 我有一个属性“deviceOnline”:
internal var deviceConnected = true
这是使用不同类的观察者设置的:
override public func viewDidLoad() {
super.viewDidLoad()
stackView.customPadding(Constants.stackViewPadding, after: submitButton)
addConectivityObserver()
}
// MARK: - Configuration
private func addConectivityObserver() {
NotificationCenter.default.addObserver(self, selector: #selector(connectivityChanged(notification:)), name: .connectivityStatusChanged, object: nil)
}
@objc private func connectivityChanged(notification: Notification) {
if notification.object as? ConnectionService.ConnectionStatus == .connected {
deviceConnected = true
} else {
deviceConnected = false
}
}
设置布尔值后,我需要在每个子类中触发特定方法。例如,在 RetrieveCompletedordersViewController 我需要触发以下内容:
if deviceConnected {
self.tabBarItem.image = #imageLiteral(resourceName: "retrieve_completed")
self.errorLabel?.isHidden = true
} else {
self.tabBarItem.image = #imageLiteral(resourceName: "retrieve_offline")
self.errorLabel?.isHidden = false
}
还有一个类似的方法,但显然在另一个子类中的不同属性上。我真的想避免向每个子类添加属性观察器,因为这似乎没有必要。最干净的方法似乎是以某种方式在“deviceConnected”的 willSet 方法中设置子类的属性,但因为这些类不是单例 BaseLookupViewController。在没有重复代码的情况下实现这一目标的最简洁方法是什么?
【问题讨论】:
标签: swift subclass superclass observers