Почему контроллер разделенного представления всегда должен быть корнем любого создаваемого вами интерфейса?

#objective-c #ios #ipad #uisplitviewcontroller

#objective-c #iOS #iPad #uisplitviewcontroller

Вопрос:

В руководстве разработчика Apple указано: «Контроллер разделенного представления всегда должен быть корнем любого создаваемого вами интерфейса» (смотрите здесь). Мне было любопытно, знает ли кто-нибудь, почему они так решили. У меня есть приложение на основе навигатора вкладок, и имеет смысл, чтобы содержимое одной из вкладок было представлено в разделенном представлении. Почему Apple должна быть против такого дизайна? Заранее спасибо за ваши ответы.

-Макс

PS Я не ищу способы поместить контроллер разделенного представления в контроллер навигатора вкладок (это я могу выяснить, даже если код выглядит неаккуратно). Мне больше любопытно, есть ли у кого-нибудь идеи, почему Apple не одобряет это.

Ответ №1:

Я не думаю, что это обязательно решение пользователя, скорее это техническое ограничение. UIKit делает ряд предположений о том, как будут использоваться UIViewControllers. Включая идею о том, что только один экземпляр UIViewController имеет свой вид, видимый в данном окне в любой момент времени. Теперь, поскольку у Apple есть доступ к реализации, они смогли создавать исключения для своих собственных классов «container view controller» (UINavigationController, UITabBarController и UISplitViewController). Мы не можем точно сказать, насколько особыми являются эти контроллеры или что им нужно было сделать для поддержки корректного отображения вложенных контроллеров вложенных представлений, но, по-видимому, одним из следствий является то, что UITabBarController и UISplitViewController предназначены для использования только в качестве контроллера корневого представления окна. Попытка вложить их в другие контроллеры контейнерного представления может привести к неожиданному или ненадежному поведению.

Я попытался рассмотреть эти ограничения на использование контроллеров представления и некоторые возможные альтернативы здесь: http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers Надеюсь, это вам пригодится, но, боюсь, единственный надежный способ получить пользовательский интерфейс, который вы, похоже, ищете, — реализовать свой собственный стиль отображения разделенного представления в представлении одного UIViewController.

Комментарии:

1. здравствуйте, я впервые работаю с SplitView. У меня есть вкладка в качестве корня, затем splitview, прикрепленный к нескольким вкладкам в качестве связей, затем navs и т.д. вы сказали, что «и UITabBarController, и UISplitViewController предназначены для использования только в качестве контроллера корневого представления окна». Поскольку я использую оба, то как это возможно, если только 1 может быть root?

2. Этому ответу 6 лет, и он ссылается на ограничения iOS 4. Сегодня, используя iOS 10, мы значительно улучшили поддержку контроллеров контейнерного представления. Все еще существуют некоторые ограничения ( developer.apple.com/reference/uikit/uisplitviewcontroller отмечает, что «Вы не можете поместить контроллер разделенного вида в стек навигации».) но «только один экземпляр UIViewController имеет свой вид, видимый в данном окне в любой момент времени», больше не выполняется в современных версиях iOS.

Ответ №2:

Пожалуйста, проигнорируйте мой ответ:

Потому что вы не можете изменять размеры вложенных представлений UISplitViewController с помощью касаний?

Ответ №3:

Apple всегда придавала большое значение последовательному использованию элементов пользовательского интерфейса. Одинаковая работа всех приложений помогает пользователю сразу понять, как работает приложение, даже если они никогда его раньше не видели. Установление концептуальной иерархии контейнеров контроллера представления имеет большой смысл, когда вы пытаетесь помочь пользователю предсказать поведение.