web-dev-qa-db-fra.com

L'extension UIViewController ne permet pas de remplacer les fonctions liées à la vue dans Swift?

En essayant d'implémenter une extension pour IViewController je me rends compte qu'il n'y a pas de moyen normal, ou n'est pas autorisé à remplacer ces fonctions (même lorsqu'elles sont disponibles pour ICollectionViewController et - ITableViewController):

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

Je me rends compte qu'il n'y a pas de moyen normal, ou n'est pas autorisé à remplacer ces fonctions (même lorsqu'elles sont disponibles pour ICollectionViewController et ITableViewController):

  • viewDidLoad
  • viewWillLoad
  • viewWillAppear
  • viewDidAppear

Il existe un moyen de le faire? Je voudrais avoir une implémentation là-bas et travailler pour chaque IViewController sur mon application ... Tout en un seul endroit.

Veuillez noter que je ne le fais pas je veux créer une nouvelle classe sous-classant UIViewController, remplaçant ces méthodes et obligeant mon contrôleur à l'étendre. C'est la solution la plus évidente et la plus simple, mais cela ne satisfait pas ce que j'essaie de faire.

J'utilise Swift 1.2 dans XCode 6.3

19
Hugo Alonso

Ce que vous essayez de faire est similaire à ce que fait ce code:

class MyClass {
    func myFunc() {}
}

extension MyClass {
    override func myFunc() {}
}

Les 4 méthodes que vous essayez de remplacer sont définies dans UIViewController, et non dans l'une de ses superclasses. Et vous ne pouvez pas remplacer une méthode définie dans la même classe.

Mise à jour

Je peux penser à 2 façons différentes de résoudre le problème - la première est celle que vous ne voulez pas (sous-classement UIViewController).

L'autre est la méthode swizzling - je ne l'ai jamais utilisée, donc je ne veux pas vous fournir d'informations inexactes. Peut-être que ça vaut la peine d'être lu cet article par Nate Cook, qui montre d'ailleurs un exemple de remplacement de viewWillAppear.

20
Antonio