2015-04-29 11 views
9

Starając się realizować rozszerzenie dla UIViewController Zdaję sobie sprawę, że nie jest normalny sposób, albo nie wolno przesłaniać tej funkcji (nawet gdy są one dostępne dla UICollectionViewController i UITableViewController):Rozszerzenie UIViewController nie pozwala na zastąpienie funkcji związanych z widokiem w Swift?

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

Zdaję sobie sprawę, że nie jest normalny sposób, albo nie wolno przesłaniać tej funkcji (nawet gdy są one dostępne dla UICollectionViewController i UITableViewController):

  • viewDidLoad
  • viewWillLoad
  • viewWillAppear
  • viewDidAppear

Jest jakiś sposób, żeby to zrobić? Chciałbym mieć tam implementację i pracować dla każdego UIViewController w mojej aplikacji ... Wszystko w jednym miejscu.

Proszę pamiętać, że Nie chcesz, aby nowa klasa instacji UIViewController, zastępując te metody i sprawienie, że mój kontroler przedłużyć go. Jest to oczywiste i najprostsze rozwiązanie, ale to nie satysfakcjonuje tego, co próbuję zrobić.

Używam szybką 1.2 w Xcode 6,3

+1

Czy możesz wyjaśnić trochę, dlaczego chcesz to zrobić? Sądzę, że chodzi o to, że 'viewDidLoad' itd. Istnieje i istnieje dokładnie po to, aby je pominąć, a ponieważ normalnie _nie to je zastępuje (ponieważ to jest dokładnie to, na czym one polegają), co jeszcze chcesz? – matt

+0

Chciałbym mieć tam pewne rzeczy, i dzieje się dla każdego UIViewController na mojej hierarchii. Powiedzmy, chciałbym sprawdzić, na przykład, czy istnieje łączność za każdym razem, gdy przedstawiam UIViewController. Jest to możliwe dla UIViewCollectionController, więc .. dlaczego nie dla UIViewController? –

+1

"Chciałbym sprawdzić, na przykład, czy istnieje łączność za każdym razem, gdy przedstawiam UIViewController" Pozwól mi trochę bardziej naciskać.Dlaczego musisz to robić? Czy nie byłoby bardziej sensowne sprawdzanie, czy istnieje łączność za każdym razem, gdy korzystasz z połączenia? – matt

Odpowiedz

12

Co próbujesz zrobić jest podobny do tego, co odbywa się poprzez ten kod:

class MyClass { 
    func myFunc() {} 
} 

extension MyClass { 
    override func myFunc() {} 
} 

W 4 sposoby, które próbują przesłonić są zdefiniowane w UIViewController, a nie jednej z jej nadklas. Nie można też przesłonić metody zdefiniowanej w tej samej klasie.

Aktualizacja

mogę myśleć o 2 różnych sposobów rozwiązania problemu - pierwszą jest jeden nie chcesz (instacji UIViewController).

Drugą metodą jest swizowanie - nigdy jej nie używałem, więc nie chcę podawać niedokładnych informacji. Może warto przeczytać this article autorstwa Nate'a Cooka, który, nawiasem mówiąc, pokazuje przykład zastąpienia viewWillAppear.

+0

To ma sens. Jakiekolwiek obejście? –

+0

@HugoAlonso: może tak - przeczytaj odpowiedź aktualizacji – Antonio

+0

@Antonio Jestem nowy na szybkie, więc możesz mi powiedzieć, jaki jest cel lub korzyść korzystania z rozszerzenia? Na przykład dlaczego umieszczanie tableview dataSource w rozszerzeniu nie bezpośrednio w mojej klasie? – Chlebta

Powiązane problemy