Каков наилучший способ программно добавлять и удалять представления и их контроллеры? - PullRequest
3 голосов
/ 05 января 2012

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

По сути, в методе loadView контроллера основного приложения моего приложения я сначала создаю корневой вид и устанавливаю self.view для него. Когда я хочу подключить контроллер, скажем, первый, который отображает, я вызываю этот метод:

-(void) attachViewForController:(UIViewController*)controller
{
    [self.mRootView addSubview:controller.view];
    [controller viewWillAppear:NO];    
}

Обратите внимание, что я явно вызываю viewWillAppear (я полагаю, что он не вызывался автоматически), где я вручную выполняю любые анимации, чтобы добавить представление (скольжение, затухание и т. Д.). Что-то не так или странно с таким подходом здесь?

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

-(void) setControllerSwitch:(UIViewController*)outgoingController 
    incomingController:(UIViewController*)incomingController
    delay:(float)delay;
{
    self.mOutgoingController = outgoingController;
    self.mIncomingController = incomingController;
    self.mSwitchControllerTimer = [NSTimer scheduledTimerWithTimeInterval:delay target:self selector:@selector(switchControllerCallback) userInfo:nil repeats:NO];

}

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

-(void) switchControllerCallback
{
    self.mSwitchControllerTimer = nil;

    // remove outgoing view
    [mOutgoingController.view removeFromSuperview];

    // add incoming view
    [self attachViewForController:mIncomingController]; 
}

Это достойный способ управлять вещами? Несколько баллов:

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

  2. Как упоминалось ранее, мне любопытно узнать, является ли явный вызов viewWillAppear "нет-нет", и есть более подходящий способ управления потоком представления.

1 Ответ

1 голос
/ 05 января 2012

Скопировано из документации Apple для разработчиков, но мне очень помогает понять представления и управлять несколькими представлениями.

Советы по эффективному использованию представлений

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

Представления не всегда имеют соответствующий контроллер представления

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

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

Дополнительные сведения о контроллерах представления информации и их роли в приложениях см. В Руководстве по программированию контроллера представления для iOS.

СвернутьНестандартный рисунок

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

Воспользуйтесь преимуществами режимов содержимого

Режимы содержимого минимизируют количество времени, затрачиваемое на перерисовку ваших просмотров.По умолчанию представления используют режим содержимого UIViewContentModeScaleToFill, который масштабирует существующее содержимое представления в соответствии с прямоугольником рамки представления.При необходимости вы можете изменить этот режим, чтобы по-разному настраивать содержимое, но по возможности избегайте использования режима содержимого UIViewContentModeRedraw.Независимо от того, какой режим содержимого работает, вы всегда можете заставить свой вид перерисовать его содержимое, вызвав setNeedsDisplay или setNeedsDisplayInRect:.

Объявите представления как непрозрачные, когда это возможно

UIKit использует непрозрачное свойство каждого представления, чтобы определить, может ли представление оптимизировать операции компоновки.Установка значения этого свойства в YES для пользовательского представления говорит UIKit, что ему не нужно отображать какой-либо контент за вашим представлением.Меньше рендеринга может привести к увеличению производительности вашего кода для рисования и обычно рекомендуется.Конечно, если для непрозрачного свойства установлено значение YES, ваше представление должно полностью заполнить прямоугольник границ полностью непрозрачным содержимым.

Настройка поведения чертежа при прокрутке при просмотре

Южная КаролинаРоллинг может повлечь за собой многочисленные обновления просмотра в короткие сроки. Если код отрисовки вашего вида не настроен должным образом, производительность прокрутки для вашего вида может снизиться. Вместо того, чтобы постоянно следить за тем, чтобы содержимое вашего представления было нетронутым, рассмотрите возможность изменения поведения вашего представления при запуске операции прокрутки. Например, вы можете временно снизить качество отображаемого содержимого или изменить режим содержимого во время выполнения прокрутки. Когда прокрутка останавливается, вы можете вернуть вид в прежнее состояние и обновить его по мере необходимости.

Не настраивать элементы управления путем встраивания подпредставлений

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

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