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

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

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

Спасибо.


person nekiTamoTip    schedule 08.12.2011    source источник
comment
Я подумал, что ответом может быть parentViewController, который, как я обнаружил, работает в iOS 8, но не 7, по крайней мере, в моем случае использования.   -  person Bjorn Roche    schedule 17.01.2015


Ответы (2)


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

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

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

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

person matt    schedule 19.12.2011

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

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

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

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

person gschandler    schedule 08.12.2011
comment
Большое спасибо за точку в правильном направлении. Однако definesPresentationContext не имеет значения. UITabBar все еще отвечает, я полагаю, потому что он получает presentViewController:animated:completion:. Мне пришлось прибегнуть к регистрации контроллера представления с помощью делегата приложения и ссылаться на него таким образом. - person nekiTamoTip; 09.12.2011