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

Implement a DidSet for all UIViewController's title in app

提问人:Cublax 提问时间:10/22/2020 更新时间:10/22/2020 访问量:379

问:

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

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

iOS Swift iPhone UIViewController UIAningBar

评论


答:

1赞 Adis 10/22/2020 #1

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

extension ViewController {
    func setTitle(_ title: String) {
        self.title = title
        // Do whatever you need to do else
    }
}
1赞 Dávid Pásztor 10/22/2020 #2

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

但是,还有其他几种选择。

您可以创建一个子类,在其中重写该属性并添加此重写属性。你只需要确保你所有的视图控制器都会对你的基类进行子类化,而不是。UIViewControllertitledidSetUIViewController

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

BaseViewController().title = "title"

还可以使用新方法进行扩展,在该方法中设置属性并在此处添加要添加到 .使用此解决方案,您可以继续子类化,您不需要 ,但您需要确保调用而不是直接为属性赋值。UIViewControllertitledidSetUIViewControllerBaseViewControllersetTitletitle

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

UIViewController().setTitle("other")