覆盖 UIViewConrtoller 扩展中的 preferredStatusBarStyle

Posted

技术标签:

【中文标题】覆盖 UIViewConrtoller 扩展中的 preferredStatusBarStyle【英文标题】:override preferredStatusBarStyle in UIViewConrtoller extension 【发布时间】:2017-03-03 14:40:14 【问题描述】:

我想在UIViewController 的扩展中覆盖preferredStatusBarStyle,如下所示:

extension UIViewController 
    open override var preferredStatusBarStyle: UIStatusBarStyle 
      return .lightContent
    

编译器抛出此错误Getter for 'preferredStatusBarStyle' with Objective-C selector 'preferredStatusBarStyle' conflicts with method 'preferredStatusBarStyle()' with the same Objective-C selector

将相同的覆盖应用于UINavigationController 而不是UIViewController 有效;但preferredStatusBarStyle 是一个由UIViewController 继承的var。

-> 为什么可以将此扩展应用到UINavigationController 而不能应用到UIViewController

【问题讨论】:

【参考方案1】:

您不能通过 Swift 中的扩展在引入该属性的类上以这种方式覆盖(重新声明实现)已实现的属性。

您绝对应该创建一个UIViewController 子类并在应用程序范围内使用它。

不过,有一个选项。您可以使用 Objective-C 通过提供扩展类别来覆盖它,适用于 UIFont 的类似内容在这里回答:Is there a way to change default font for your application。但是,这样做并不完全安全,如果不够小心,您应该预料到独角兽会来。

【讨论】:

谢谢米奇。我不喜欢拥有 UIViewController 的自定义基类的想法,因此我必须一次又一次地在每个 UIViewController 类中实现它...... 不,你不会,你需要做的就是从MyBaseViewController而不是UIViewController继承所有其他控制器,并在你的MyBaseViewController中实现通用的东西。这可能是推荐的方式。 当我说“我不喜欢拥有自定义 UIViewController 基类的想法”时,这正是我的想法

以上是关于覆盖 UIViewConrtoller 扩展中的 preferredStatusBarStyle的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 Swift 扩展中的方法

覆盖在swift中的扩展对象内不起作用

覆盖在swift中的扩展对象内不起作用

如何在 Container 中垂直扩展 TextField 以覆盖 Flutter 中的所有可用空间

swift 1.2 覆盖 NSManagedObject 扩展中的 prepareForDeletion

快速覆盖文件私有扩展名中的打开变量时发出警告