Подтвердить что ты не робот

Self.presentingViewController возвращает UITabBarController, а не контроллер представления, нажимая его с помощью currentModalViewController

У меня есть приложение на основе tab. Один из views в нем нажимает modal view controller. Если я вызываю self.presentingViewController в пределах modal view controller, он возвращает tab bar controller, а не view controller, который его нажимает.

Что мне здесь не хватает? Есть ли надежный способ возврата модальности view controller?

Спасибо.

4b9b3361

Ответ 1

Это приложение для iPhone? Если это так, это объясняет путаницу. На iPhone единственный стиль презентации - UIModalPresentationFullScreen - это означает, что на iPhone контроллер корневого представления всегда является представлением контроллера представления. Ну, в интерфейсе панели вкладок представление UITabBarController является контроллером корневого представления.

Вы заметите, что на iPhone модальное представление не заменяет ваше представление контроллера вида; он заменяет весь интерфейс, что означает, что он заменяет вид контроллера панели вкладок. Это связано с тем, что контроллер панели вкладок действительно представляет собой контроллер представления.

Я предполагаю, что на iPhone вы действительно не должны отправлять presentViewController: или presentModalViewController: в контроллер вида, содержащий контроллер панели вкладок. Вы должны отправить его в контроллер панели вкладок. Поэтому сообщение направляется к контроллеру панели вкладок.

Итак, ничего интересного не произойдет со значением presentingViewController, если вы не на iPad. На iPad вы можете сделать модальный вид заменой вида просмотра. Для этого модальный вид modalPresentationStyle должен быть UIModalPresentationCurrentContext. И в этом случае его presentingViewController может фактически быть представлением, которое "толкает контроллер модального представления".

Ответ 2

Из документации Apple:

По умолчанию реализация этого свойства просматривает представление иерархии, начиная с этого контроллера представления. Первый вид контроллер обнаружил, что получил presentViewController: анимированный: завершение: метод или definePresentationContext свойство, установленное в YES, возвращается как значение свойства. Он продолжает подниматься по иерархии, пока находит значение, возвращаемое или попадающее в контроллер корневого представления.

Итак, несмотря на то, что другой контроллер представления его подтолкнул, это представление контроллера просмотра покрывается модальным представлением. Они поднимаются по иерархии до тех пор, пока не найдут контроллер вида, который не имеет скрытого представления, или имеет значение definesPresentationContext в значение YES или до тех пор, пока он не достигнет контроллера корневого представления, который в вашем случае был контроллером панели вкладок.

Я бы сказал, что диспетчер представления представления должен установить definesPresentationContext в YES, чтобы ответить на ваш вопрос о том, как вернуть этот контроллер представления, который представил модальный.