2015-07-03 18 views
8

Mam dwa kontrolery widoku, MainVC i ModalVC.Dlaczego niewłaściwą praktyką jest odrzucanie viewController'a?

Gdy użytkownik dotknie przycisku na MainVC, pojawi się kontroler widoku modalnego.

Użytkownik może następnie dotknąć innego przycisku, aby go zamknąć i powrócić do głównego.

Próbowałem tych dwóch metod i obaj osiągnąć to samo: że odrzucenie modalne kontrolera wyświetlania:

//method 1: 
// File: ModalVC.swift 
// 
@IBAction func dismissTapped() { 
    self.dismissViewControllerAnimated(false, completion: nil); 
} 

który działa dobrze, jak powiedziałem, ale rozważyć inną metodę: using delegację pozwolić główny sterownik zrobić zwalniających:

// method 2: part A 
// File: ModalVC.swift 
// 
protocol ModalVCDelegate { 
    func modalVCDismissTapped(); 
} 
... 
... 
... 
var delegat:ModalVCDelegate? = nil; 
... 
... 
@IBAction func dismissTapped() { 
    delegate.modalVCDismissTapped(); 
} 

i na głównym pliku widok kontroler zwyczaj klasa:

// method 2: part B 
// File: MainVC.swift 

class MainVC : UIViewController, ModalVCDelegate { 
... 
... 
    func modalVCDismissTapped() { 
     self.dismissViewControllerAnimated(false, completion: nil); 
    } 
} 

Ponieważ te dwie metody są potrzebne, czy powinienem się martwić ewentualnym wyciekiem pamięci?

Wszelkie wyjaśnienie pomogłoby

Odpowiedz

13

Korzystanie delegacji jest najlepszy i bardziej elastyczny sposób, aby oddalić widok kontrolera.
Celem jest to, że w przyszłości lub w innym miejscu kodu możesz ponownie użyć tego VC, ale z pewnych powodów możesz nie pokazać go modalnie, ale wrzucić do stosu nawigacyjnego. Twój ModalVC nie wie, w jaki sposób został zaprezentowany, ale deleguje.
W tym przypadku można mieć 2 miejsca w kodzie

  1. można przedstawić to modalne i delegat wzywa

    [self dismiss...] 
    
  2. można ją wepchnąć nawigacji stosu i delegat wzywa

    [self.navigationController popView...] 
    
  3. Możesz dodać jako dziecko VC i delegować połączenia

    [someParentVC removeChild..] 
    

    lub inny odpowiedni przepływ pracy, aby go usunąć.

+0

Świetna odpowiedź. Podsumowując w jednym zdaniu: kontroler widoku "modalnego" nie wie, w jaki sposób klienci będą go używać/prezentować, dlatego też musi on być odpowiedzialny za jego odrzucenie. –

+0

Albo w skrócie: ten, kto je stworzył i jest jej właścicielem, powinien także poradzić sobie z jego odrzuceniem. – Eiko

Powiązane problemy