web-dev-qa-db-ja.com

UIViewController拡張機能では、Swiftでビュー関連の機能をオーバーライドできませんか?

IViewControllerの拡張機能を実装しようとしているときに、通常の方法がないか、またはICollectionViewControllerおよび- ITableViewController):

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

通常の方法がないか、この関数をオーバーライドすることが許可されていないことを理解しています(たとえICollectionViewControllerおよびITableViewControllerで使用できる場合でも)。

  • viewDidLoad
  • viewWillLoad
  • viewWillAppear
  • viewDidAppear

これを行う方法はありますか?私はそこにいくつかの実装を用意し、すべてのIViewControllerをアプリで機能させたいと思っています...すべて1か所で。

しないでください UIViewControllerをサブクラス化する新しいクラスを作成し、それらのメソッドをオーバーライドして、コントローラーでそれを拡張することに注意してください。これは明白で最も簡単な解決策ですが、これは私がやろうとしていることを満たしていません。

XCode 6.3でSwift 1.2を使用しています。

19
Hugo Alonso

あなたがやろうとしていることは、このコードによって行われていることと似ています:

class MyClass {
    func myFunc() {}
}

extension MyClass {
    override func myFunc() {}
}

オーバーライドしようとしている4つのメソッドは、スーパークラスの1つではなく、UIViewControllerで定義されています。また、同じクラスで定義されているメソッドをオーバーライドすることはできません。

更新

私は問題を解決する2つの異なる方法を考えることができます-1つ目は、望まない方法です(UIViewControllerをサブクラス化する)。

もう1つはメソッドのスウィズリングです。これを使用したことがないので、不正確な情報を提供したくありません。多分それは読む価値があります この記事 Nate Cookが偶然viewWillAppearを置き換える例を示しています。

20
Antonio