在iOS开发中,UIViewController
的 title
属性是一个常用的属性,用于设置视图控制器的标题。如果你想要在所有 UIViewController
的子类中实现一个 title
属性的 didSet
观察者,可以通过以下几种方式来实现:
你可以通过 Swift 的扩展功能为所有的 UIViewController
添加 title
属性的 didSet
观察者。
import UIKit
extension UIViewController {
override open var title: String? {
didSet {
// 在这里处理 title 变化的逻辑
print("Title changed to \(title ?? "")")
// 例如,更新导航栏标题
navigationController?.navigationBar.topItem?.title = title
}
}
}
创建一个 UIViewController
的基类,并在该基类中实现 title
属性的 didSet
观察者。
import UIKit
class BaseViewController: UIViewController {
override open var title: String? {
didSet {
// 在这里处理 title 变化的逻辑
print("Title changed to \(title ?? "")")
// 例如,更新导航栏标题
navigationController?.navigationBar.topItem?.title = title
}
}
}
然后,让你的所有 UIViewController
子类都继承自 BaseViewController
。
class MyViewController: BaseViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.title = "My View Controller"
}
}
你可以使用通知机制来监听 title
属性的变化。
首先,定义一个通知名称:
extension Notification.Name {
static let titleDidChange = Notification.Name("titleDidChange")
}
然后,在 UIViewController
中发送通知:
import UIKit
class MyViewController: UIViewController {
override open var title: String? {
didSet {
NotificationCenter.default.post(name: .titleDidChange, object: self)
}
}
}
在其他需要监听 title
变化的地方,添加观察者:
NotificationCenter.default.addObserver(self, selector: #selector(handleTitleDidChange), name: .titleDidChange, object: nil)
@objc func handleTitleDidChange(notification: Notification) {
if let viewController = notification.object as? UIViewController {
print("Title changed to \(viewController.title ?? "")")
}
}
title
变化时,自动更新导航栏的标题。title
变化的日志,便于调试和分析。title
的变化,动态更新 UI 元素。deinit {
NotificationCenter.default.removeObserver(self, name: .titleDidChange, object: nil)
}
title
变化频繁,可能会影响性能。可以通过设置合理的观察机制来优化性能。UIViewController
的实现可能会有所不同。确保代码在不同版本的 iOS 上都能正常工作。通过以上方法,你可以在所有的 UIViewController
子类中实现对 title
属性的 didSet
观察,从而在 title
变化时执行相应的逻辑。
领取专属 10元无门槛券
手把手带您无忧上云