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

Общие сведения о вложенности контроллера View в iOS

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

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

    • Не рекомендуется в соответствии с Apple "Один VC на экран содержимого"
    • Вполне возможно, добавив VC через код
    • Просто не сделано. Вместо этого используйте один VC и просто добавьте код, который имитирует функциональные возможности контроллеров представления, которые вы хотите.

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

Это окончательно возможно в IOS 4:

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

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

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

  • (void) addChildViewController: (UIViewController *) childController

Ответ 3

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

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

Здесь подробно описано здесь:

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

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

Контроллеры с несколькими представлениями координируют свои усилия, чтобы представить один унифицированный пользовательский интерфейс.