UIViewController 扩展不允许覆盖 Swift 中的视图相关功能?

Posted

技术标签:

【中文标题】UIViewController 扩展不允许覆盖 Swift 中的视图相关功能?【英文标题】:UIViewController extension not allowing to override view related functions in Swift? 【发布时间】:2015-04-29 18:43:41 【问题描述】:

在尝试为 UIViewController 实现扩展时,我意识到没有正常的方法,或者不允许覆盖此功能(即使它们可用于 UICollectionViewControllerUITableViewController):

extension UIViewController
  public override func viewWillAppear()
    super.viewWillAppear()
    //do some stuff
 

我意识到没有正常的方法,或者不允许覆盖此函数(即使它们可用于 UICollectionViewControllerUITableViewController):

viewDidLoad viewWillLoad viewWillAppear viewDidAppear

有什么方法可以做到这一点?我想在那里进行一些实现,并为我的应用程序上的每个 UIViewController 工作......都在一个地方。

请注意,我不想创建一个新类的子类 UIViewController,覆盖这些方法并使我的控​​制器 扩展它。这是显而易见且最简单的解决方案,但这并不能满足我想要做的事情。

我在 XCode 6.3 中使用 swift 1.2

【问题讨论】:

你能解释一下为什么你想这样做吗?我想我的意思是,因为 viewDidLoad 等存在,并且存在正是为了让您覆盖它们,并且因为通常 确实 覆盖它们(因为这正是它们的用途) ,你想要什么更多 我想在那里做一些事情,并为我的层次结构中的每个 UIViewController 继续。比方说,我想检查一下,例如,每次我呈现 UIViewController 时是否有连接。这对 UIViewCollectionController 来说是可能的,所以.. 为什么不是 UIViewController? “我想检查一下,例如,每次我呈现一个 UIViewController 时是否有 Connectivity” 让我再强调一下。为什么你需要这样做?每次需要连接时检查是否有连接不是更有意义吗? 所以在每个viewWillAppear 中重复的一行代码是脏的?或者,让每个视图控制器成为一个公共超类的子类,为viewWillAppear 添加功能也是脏的?那么什么会是脏的?是否要求修改 UIViewController 自己的viewWillAppear 的核心功能?你可以这样做(因为 Objective-C 的运行时是动态的),但对我来说,that 是肮脏的解决方案。 不过,您可能还想阅读例如如果你好奇的话:***.com/questions/5339276/… 【参考方案1】:

您尝试做的与这段代码所做的类似:

class MyClass 
    func myFunc() 


extension MyClass 
    override func myFunc() 

您尝试覆盖的 4 个方法在 UIViewController 中定义,而不是在其超类之一中定义。而且你不能覆盖在同一个类中定义的方法。

更新

我可以想到 2 种不同的方法来解决问题 - 第一种是您不想要的方法(子类化 UIViewController)。

另一个是方法调配——我从未使用过它,所以我不想为您提供不准确的信息。也许值得一读 Nate Cook 的 this article,它顺便展示了一个替换 viewWillAppear 的示例。

【讨论】:

@Antonio 我是 swift 新手,所以你能告诉我使用扩展的目的或优势是什么吗?例如,为什么不直接将 tableview dataSource 放在扩展名中? @Chlebta 这通常是为了让代码更简洁。我通常在实现委托时使用扩展,因此每个实现的委托一个扩展。不要到处使用它们,这又是一种反模式。

以上是关于UIViewController 扩展不允许覆盖 Swift 中的视图相关功能?的主要内容,如果未能解决你的问题,请参考以下文章

Monotouch:覆盖 UIViewController 方法的正确方法

在不覆盖全屏的 UIViewController 中模态显示 UIViewController

通过 UIViewController 传递触摸

覆盖 UIViewConrtoller 扩展中的 preferredStatusBarStyle

Django 模板扩展:子级不覆盖父级

UIViewController 内的 UICollectionView 不允许滚动