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

Несколько контроллеров на экране одновременно?

Я пытаюсь обвести голову вокруг контроллеров в Cocoa Touch. Основная проблема заключается в том, что я хотел бы иметь сразу несколько контроллеров "на экране" - я хочу иметь большой вид (с контроллером A), состоящий из меньших представлений, контролируемых их собственными контроллерами (скажем, B). Id нравится иметь его таким образом, потому что деление делает код намного чище. Плохо то, что дополнительные контроллеры (типа B) не являются "первоклассными гражданами" на экране, например, они не получают запросы на авторотацию и уведомления. (И не могут легко отображать модальные контроллеры, они должны отправить сообщение presentModal… своему родительскому контроллеру.)

В чем разница между контроллерами A и B с точки зрения Cocoa? Поддерживает ли система какой-то указатель на "самый передний контроллер", привилегированный, на который он отправляет уведомления и такие вещи? Почему другие контроллеры не получают их, даже если их взгляды находятся на экране? Имеет ли несколько контроллеров "на экране" считающийся взломом? Или это поддерживается, и я просто пропустил какой-то момент? Спасибо.


Подробнее о проблеме, которую я пытаюсь решить: я пишу простой браузер фотографий. Фотографии отображаются в полноэкранном режиме, пользователь может прокручивать влево или вправо, чтобы изменить фотографии. Контроллер A берет на себя часть прокрутки, а контроллеры B заботятся о каждой фотографии.

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

Единственное, что мне не нравится в текущем решении, это то, что мне приходится вручную работать с B, не являясь "первоклассным" контроллером. Мне нужно передать некоторые вызовы вручную через A в B, и когда B хочет отобразить модальное диалоговое окно, он должен отправить presentModal… в A. Что является уродливым.

4b9b3361

Ответ 2

Это не тесно связано с исходным вопросом, но важно. Apple четко заявляет в Руководстве по программированию в View Controller, что диспетчер представлений отвечает за управление только одним содержимым экрана:

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

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

Однако в руководстве по программированию iPad они также говорят, что могут быть контроллеры представления контейнеров:

"Контроллер представления отвечает за один вид. В большинстве случаев ожидается, что представление диспетчера представлений заполнит весь диапазон окна приложения. Однако в некоторых случаях контроллер просмотра может быть встроен в другое представление контроллер (известный как контроллер представления контейнера) и представлен вместе с другим контентом. Контроллеры навигации и панели вкладок являются примерами контроллеров контейнерных представлений.

До моих нынешних знаний я бы не использовал контроллеры подзадачи в контроллере представления, но попытался подклассировать NSObject и отправить сообщения им с моего главного контроллера представления.

Также проверьте эту тему: Обсуждение MGSplitViewController

Ответ 3

Во-первых, и это важно, диспетчеры просмотра не получают "на экране" - представления видят. Ваш контроллер "верхнего уровня", безусловно, может передавать типы сообщений, которые вы описываете, в "под-просмотр-контроллеры". Фактически, так работает большинство приложений. Рассмотрим приложение с панелью вкладок и где в представлениях используются контроллеры навигации. У вас на самом деле есть несколько "контрольных" контроллеров одновременно, каждый со своим собственным видом на экране одновременно - ваш "корневой" контроллер представлений будет экземпляром (или подклассом) UITabBarController, который затем имеет несколько вложенных UINavigationControllers, каждый который отобразит вложенные контроллеры представлений (например, экземпляр или подкласс UITableViewController).

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

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

Ответ 4

На самом деле вы можете заставить его работать раньше, чем iOS 5, поскольку большинство из нас одновременно нацелено на 4.x и 5.x. Я создал решение, которое работает в обоих, и оно отлично работает, несколько приложений в appstore используют его:) Прочитайте мою статью об этом или просто загрузите и используйте простой класс, который я создал для этой цели.

Ответ 5

Это довольно старый вопрос, но, думаю, есть люди, которые могут столкнуться с одной и той же проблемой сегодня, я бы хотел поделиться своим решением. Я писал это приложение, которое имело этот один экран с большим количеством информации, разбиения на страницы, элементы управления и т.д. Так как в соответствии с Apple MVC документация о роли из ViewControllers, вы не должны реализовывать логику в представлении самостоятельно или напрямую обращаться к модели данных, мне приходилось выбирать между наличием Massive ViewController с несколькими тысячами строк кода, которые трудно поддерживать и отлаживать (даже с единицей тесты) или найти новый способ.

Моим решением было использовать UIContainerView, как показано ниже: введите описание изображения здесь

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

Примечание. Этот ответ - просто руководство, чтобы показать путь, вы можете найти хорошее и подробное объяснение того, как оно работает и как его реализовать ЗДЕСЬ