Несколько представлений в одном XIB — iPhone SDK

StackOverflow https://stackoverflow.com/questions/765521

  •  12-09-2019
  •  | 
  •  

Вопрос

Я потратил время на изучение того, как использовать iPhone SDK.Я прочел "Начало разработки iPhone:Изучение iPhone SDK«от корки до корки, и я никогда не видел примера нескольких представлений в одном XIB.

Чтобы проиллюстрировать, что я имею в виду, вот снимок экрана XIB с простой конфигурацией, о которой я говорю:

альтернативный текст http://theopensourceu.com/wp-content/uploads/2009/04/one-xib-multiple-views.png

Я полагаю, что должна быть очень конкретная причина, по которой я никогда этого не видел.В примерах Apple и во всех моих чтениях несколько XIB используются только с одним «представлением» (а иногда и с контроллером навигации или контроллером панели вкладок и т. д.).Что является причиной этого?Следует ли мне избегать нескольких представлений внутри XIB?Каковы преимущества или недостатки того или иного метода?

заранее спасибо

Это было полезно?

Решение

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

Если вместо этого вы разделите свои представления на отдельные XIB, ваше приложение запустится намного быстрее, поскольку будет загружен только XIB, содержащий исходное представление, и сначала оно будет использовать меньше памяти.Затем, когда представление изменится, вы можете лениво загрузить XIB, содержащий новое представление.Это приведет к незначительной заминке при первом открытии представления.Если вы Действительно пытаясь оптимизировать использование памяти, вы также можете выгрузить предыдущее представление при переключении представлений, но я бы не рекомендовал этого, поскольку это будет вызывать заминку каждый раз, когда вы переключаете представления, а не только при первом переключении на любое данное представление.

Другие советы

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

Создайте UIScrollView в XIB вместе с UIView для каждой необходимой вам страницы.Поскольку UIViews являются частью XIB, они будут одновременно загружены в память при открытии отчета.Создайте два UIViewController и используйте их для отображения просматриваемой страницы и страницы, к которой прокручивается.Когда пользователь перемещается по страницам, повторно используйте UIViewController на прокручиваемой странице, чтобы удерживать прокручиваемую страницу.

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

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

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

http://cocoawithlove.com/2009/01/multiple-virtual-pages-in-uiscrollview.html

Это предупреждение для всех, кто пытается реализовать альбомную и портретную ориентацию с двумя представлениями в одном XIB (iOS 4 с Xcode 4).Основным недостатком наличия двух представлений в одном XIB (для меня) было то, что вы могли подключить только один объект UIOutlet в XIB к одному объекту UIOutlet в контроллере представления.

Так, например, если у вас есть XIB с представлением для альбомной ориентации и представлением для книжной ориентации, и оба представления содержат одни и те же объекты интерфейса в разных положениях (например, UILabel в альбомной ориентации и UILabel в книжной ориентации).Невозможно связать UILabel в портретном режиме. и объект UILabel в альбомной ориентации к одному объекту UILabel в контроллере представления в то же время.

Меня это разочаровывает, поскольку в документации iOS UIViewController (iOS 4.3) предполагается, что я могу реализовать собственные альбомные и портретные представления, программно переключаясь между двумя представлениями при повороте экрана.

Потратив некоторое время на то, чтобы понять, как это сделать, я обнаружил, что к одному контроллеру представления можно прикрепить два разных представления, но вам нужно иметь выходы для обоих представлений.Например, в моем контроллере представления у меня есть два объекта UILabel (один для подключения к UILabel в портретном представлении;один для подключения к UILabel в альбомной ориентации).В моем коде каждый раз, когда я обновляю альбомную ориентацию, я также обновляю портретную ориентацию.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top