UIViewController 扩展不允许覆盖 Swift 中的视图相关功能?
Posted
技术标签:
【中文标题】UIViewController 扩展不允许覆盖 Swift 中的视图相关功能?【英文标题】:UIViewController extension not allowing to override view related functions in Swift? 【发布时间】:2015-04-29 18:43:41 【问题描述】:在尝试为 UIViewController 实现扩展时,我意识到没有正常的方法,或者不允许覆盖此功能(即使它们可用于 UICollectionViewController和 UITableViewController):
extension UIViewController
public override func viewWillAppear()
super.viewWillAppear()
//do some stuff
我意识到没有正常的方法,或者不允许覆盖此函数(即使它们可用于 UICollectionViewController 和 UITableViewController):
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