Взаимодействие между addChildViewController UINavigationController и topViewController


У меня есть что-то вроде модального контроллера вида, который мне нужно отобразить над другими контроллерами вида. Я не использую обычную функцию модального контроллера (presentViewController: и друзья), так как мне нужен лучший контроль над процессом. Вместо этого я использую функцию сдерживания контроллера вида (группа методов addChildViewController:).

Функция сдерживания делает код довольно простым. Когда мне нужно представить" модальный " контроллер вида, я добавляю его в качестве дочернего элемента в иерархию контроллера вида и все работает, как и ожидалось. Одна маленькая загвоздка заключается в том, что обычные контроллеры вида обернуты в навигационный контроллер. Поэтому я должен добавить модальный контроллер в качестве дочернего элемента навигационного контроллера, иначе он будет покрыт навигационной панелью и панелью инструментов.

Теперь проблема заключается в том, что вызов addChildViewController: на навигационном контроллере также устанавливает новый контроллер как topViewController, как если бы контроллер был выдвинут с помощью обычного метода pushViewController:. Это означает, что в то время как модальный контроллер отображается, обычный контроллер под ним не получает внешний вид и вращение обратных вызовов.

Это похоже на ошибку, или я что-то упустил?

2 4

2 ответа:

У меня была такая же проблема. Я решил эту проблему, написав свой собственный пользовательский контроллер представления, содержащий UINavigationController (добавленный через addChildViewController:), а затем раскрывающий UINavigationController как свойство только для чтения. Затем вы можете добавить свой модальный контроллер вида в качестве дочернего элемента вашего нового пользовательского контроллера вида, а не в качестве дочернего элемента UINavigationController

Я пропустил это предложение в документации для addChildViewController:

Этот метод предназначен только для вызова реализацией a пользовательский контроллер вида контейнера.

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