为应用中所有 UIViewController 的标题实现一个 DidSet

Implement a DidSet for all UIViewController's title in app

我正在尝试根据我为它们设置的标题自动设置每个 ViewController 应用程序的参数。

是否可以在 UIViewController 的标题 属性 上构建通用 DidSet?

可能是,但这不是必需的,您可以将这两个功能包装在一个函数或您自己的变量中:

extension ViewController {
    func setTitle(_ title: String) {
        self.title = title
        // Do whatever you need to do else
    }
}

您不能将 属性 观察者添加到扩展中现有类型的属性。要添加 属性 观察者,您需要修改实际类型的源代码,这在 UIViewController.

的情况下当然是不可能的

但是,还有一些其他选择。

您可以创建一个 UIViewController subclass,在其中覆盖 title 属性 并在此覆盖上添加 didSet 属性.你只需要确保你所有的视图控制器将 subclass 你的基础 class,而不是 UIViewController.

class BaseViewController: UIViewController {
    override var title: String? {
        didSet {
            print("title was set to \(title ?? "nil")")
        }
    }
}

BaseViewController().title = "title"

您还可以使用新方法扩展 UIViewController,您可以在其中设置 title 属性 并在此处添加您要添加​​到 [=15= 的任何其他功能].使用此解决方案,您可以继续调用 classing UIViewController,您将不需要 BaseViewController,但您需要确保调用 setTitle 而不是直接调用为 title 属性.

赋值
extension UIViewController {
    func setTitle(_ title: String?) {
        self.title = title
        print("title was set to \(title ?? "nil")")
    }
}

UIViewController().setTitle("other")