self.presentingViewController возвращает UITabBarController, а не контроллер представления, отправляющий его с presentModalViewController - PullRequest
12 голосов
/ 09 декабря 2011

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

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

Спасибо.

Ответы [ 2 ]

12 голосов
/ 20 декабря 2011

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

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

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

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

3 голосов
/ 09 декабря 2011

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

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

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

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

...