2015-07-03 3 views
8

У меня есть два контроллера вида, MainVC и ModalVC.Почему у плохой практики есть viewController?

Когда пользователь нажимает кнопку на MainVC, появляется модальный контроллер.

Пользователь может затем нажать другую кнопку, чтобы отменить его и вернуться к основному.

Я пробовал эти два способа и оба они сделать то же самое: они отвергают модальный контроллер представления:

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

Это прекрасно работает, как я сказал, но рассмотрим другой метод: с помощью делегирования, чтобы позволить главный контроллер делать Dismissing:

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

и на главном вид контроллера пользовательского файла класса:

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

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

Поскольку эти два метода делают это необходимо, я должен беспокоиться о возможной утечке памяти?

Любое объяснение поможет

ответ

13

Использования делегации является лучшим и более гибким способом уволить вид контроллер.
Целью этого является то, что в каком-то будущем или в каком-либо другом месте вашего кода вы можете повторно использовать этот VC, но по некоторым причинам вы можете не представить его модальным, а нажать на навигационный стек. Итак, ваш ModalVC не знает, как это было представлено, но делегирует.
В этом случае вы можете иметь 2 места в вашем коде

  1. Вы представить его модальным и делегат вызывает

    [self dismiss...] 
    
  2. Вы столкнуть ее в панель навигации и делегат вызывает

    [self.navigationController popView...] 
    
  3. Вы добавляете его в качестве дочернего VC и делегированных вызовов

    [someParentVC removeChild..] 
    

    или любой другой соответствующий рабочий процесс для его удаления.

+0

Отличный ответ. Подводя итог в одном предложении: ваш диспетчер вида «модальный» не знает, как клиенты будут использовать/представлять его, следовательно, он должен нести ответственность за его увольнение. –

+0

Вкратце: тот, кто создал и владеет им, должен справиться с его увольнением. – Eiko

Смежные вопросы