Понимание Вложения Контроллера Представления в iOS - PullRequest
17 голосов
/ 26 января 2012

В последние пару дней я рвал на себе волосы, пытаясь понять эту, казалось бы, основную концепцию разработки под iOS:

  • Если я хочу, чтобы два или более контроллеров представления отображались и могли использоваться в одном и том же «экране», это:

    1. Не рекомендуется в соответствии с «Один виртуальный канал Apple на один экран содержимого» * ​​1008 *
    2. Вполне возможно, добавив ВК через код
    3. Просто не сделано. Вместо этого используйте один VC и просто добавьте код, который имитирует функциональность требуемых контроллеров представления.

Позвольте мне немного перефразировать:

Если бы я хотел иметь в приложении для iPad UIView (A), который занимает большую часть левой части экрана, и второй UIView (B), который занимает остальную часть в правой части экрана, и я хотел добавить кнопку к UIView B, которая при нажатии использовала бы модальный переход, чтобы сдвинуть UITableview, чтобы заменить UIView B, и этот UITableview будет тогда действовать как типичный UITableviewController, когда пользователь выбирает элемент из таблицы, типичные события отправляются в контроллер табличного представления для добавления нового набора элементов, возможно ли это?

Мне просто кажется, что если я уже в состоянии легко создать два отдельных контроллера UIViewControl и иметь кнопку в одном VC, чтобы модально вызвать второй VC, почему я не могу объединить эту функциональность так, чтобы один VC имел два дочерних VC, и эти детские VC обрабатывают свои собственные модальные переходы.

Или в таком случае лучше всего просто иметь один виртуальный канал, который обрабатывает все, а затем вручную обрабатывать анимацию слайдов в / из различных видов после различных нажатий на различные элементы интерфейса?

Как вы можете сказать, я думаю, что я прочитал слишком много разных, противоречивых ответов на вопросы, подобные этому, которые я полностью запутался в том, что и что. Если кто-то там понимает, к чему я клоню, и может дать объяснение помощи или некоторые советы, я был бы очень благодарен.

Ответы [ 3 ]

11 голосов
/ 26 января 2012

Ответ зависит от того, нужна ли вам поддержка iOS 4 или нет.Если да, ответ таков:

Ответ № 1 - За исключением собственных контроллеров контейнеров Apple, в частности UITabBarController, UINavigationController, UISplitViewController, UIPageViewController и UIPopoverController (я что-то пропустил?), Надлежащим образом не поддерживается способиметь несколько контроллеров представления, активных на одном экране, управляющих различными частями представления.Все методы контроллера представления, такие как presentModalViewController и т. Д., Работают в предположении, что существует один «самый передний» контроллер представления, которому принадлежит весь экран, и если вы попытаетесь, чтобы несколько контроллеров представления управляли различными частями представления, все виды вещей будутперерыв, например переадресация событий поворота экрана и изменение размера / позиционирования видов после перехода страницы.

Однако, если вам нужна только поддержка iOS 5, ответ будет следующим:

Ответ № 2 -Нет проблем!Просто убедитесь, что все ваши контроллеры просмотра подстраниц правильно подключены к главному контроллеру просмотра, который управляет всей страницей.Это означает, что помимо того, что представления контроллеров являются подпредставлениями общего родительского представления, сами контроллеры должны быть дочерними контроллерами общего родительского контроллера.Пока свойства parentViewController контроллера установлены правильно, вы сможете управлять этим составным интерфейсом без особых хлопот.

К сожалению, Apple добавила только открытые сеттеры для childViewControllers и parentViewControllers в iOS5.В iOS4 и более ранних версиях вы ограничены собственными договоренностями с контроллерами контейнеров Apple и не можете создавать свои собственные (по крайней мере, не без проблем с пересылкой событий).

Так что, если вам пока требуется поддержка iOS4, ответ № 3 кажетсяКак ваша лучшая ставка: Создайте свой интерфейс, используя несколько представлений, но один контроллер.Это не так уж плохо.Вы можете создавать собственные подклассы представления, которые управляют своими собственными подвидами (например, нет правила, согласно которому tableViewDataSource или делегат должен быть подклассом UIViewController или что кнопка IBAction должна быть методом в контроллере представления вместо другого представления).

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

Единственный хитрый момент - делать такие вещи, как переходы между одним представлением и следующим.Для этого вы не сможете использовать стандартные методы presentModalViewController или pushViewController, вам придется делать анимацию самостоятельно, используя CATransitions или UIView.

3 голосов
/ 20 августа 2012

Это определенно возможно в IOS 4:

У вас есть контроллер представления "A" с его видом:

  • Назначьте инициализировать контроллер представления "B", который вы хотите иметьна вашем контроллере представления "A"
  • Вызов (void) addSubview: (UIView *) представление на представлении контроллера представления "A" с представлением контроллера представления "B" в качестве параметра
  • Рамка представления контроллера представления "B" установлена ​​в полноэкранный режим из-за addSubView, поэтому измените его, чтобы поместить представление, где вы хотите, в представление контроллера представления "A".
  • Добавьте несколькоUIView анимации, когда вы изменяете фрейм, чтобы иметь хорошее отображение.

На IOS5 просто используйте метод на вашем контроллере представления "A":

  • (void) addChildViewController:(UIViewController *) childController
2 голосов
/ 26 января 2012

Руководство по программированию View Controller охватывает это довольно хорошо.

Контроллер представления управляет набором представлений.У вас могут быть контроллеры представления содержимого и контроллеры представления контейнера / навигации, которые управляют иерархией контроллеров представления (например: контроллер представления навигации может управлять контроллером просмотра списка и контроллером подробностей).

Более подробно это рассматривается здесь:

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457

Контроллер представления управляет отдельной частью пользовательского интерфейса вашего приложения.По запросу предоставляется представление, которое можно отображать или взаимодействовать с ним.Часто это представление является корневым представлением для более сложной иерархии представлений - кнопок, переключателей и других элементов пользовательского интерфейса с существующими реализациями в iOS.Контроллер представления выступает в качестве центрального координирующего агента для этой иерархии представления, обрабатывая обмены между представлениями и любым соответствующим контроллером или объектами данных.

Несколько контроллеров представления координируют свои усилия для представления единого унифицированного пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...