Унифицированный UIViewController «стал передовым» обнаружением? - PullRequest
0 голосов
/ 09 февраля 2019

По-моему, все эти ситуации параллельны:

  • Мой контроллер представления представил еще один полноэкранный контроллер представления, который теперь был отклонен

  • Мой контроллер представления представил другой контроллер представления, не полноэкранный, который теперь отклонен

  • Мой контроллер представления представил всплывающее окно, которое теперь было отклонено

  • Мой контроллер вида выдвинул другой контроллер вида, который теперь был вытолкнут

В каждом случае мой контроллер вида перестал быть «самым передним» контроллером вида, а затем стал «самым передним»снова.Я нахожу любопытным, что в iOS нет ни одного общего события «стало первым», отправляемого моему контроллеру представления, который охватывает все эти ситуации.

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

  • viewDidAppear обнаруживает срабатывание контроллера push-представления и отклонение полноэкранного представленного контроллера представления

  • сообщение делегата popover обнаруживает отклонение popover

  • не уверен, что обнаруживает отклонение не полностью представленного контроллера представления

Как люди справляются с этим согласованно и элегантно?

1 Ответ

0 голосов
/ 09 февраля 2019

Общим для случаев является не внешний вид исходного контроллера вида, а исчезновение контроллера представленного / заданного вида.Следовательно, одним простым и понятным решением является архитектура протокола и делегата.Объявите пару протоколов следующим образом:

protocol Home : class {
    func comingHome()
}
protocol Away : class {
    var home : Home? {get set}
}
extension Away where Self : UIViewController {
    func notifyComingHome() {
        if self.isBeingDismissed || self.isMovingFromParent {
            self.home?.comingHome()
        }
    }
}
  • Контроллер домашнего просмотра должен принять Home и должен установить home каждого контроллера представления на self, когда он представляет или толкаетЭто.

  • Представленные или выдвинутые контроллеры представления должны принять Away и реализовать viewWillDisappear следующим образом:

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        self.notifyComingHome()
    }
    

Это работает длячетыре случая, перечисленные в вопросе.Жаль, что Cocoa Touch не делает этого автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...