Несколько просмотров в одном XIB - iPhone SDK - PullRequest
17 голосов
/ 19 апреля 2009

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

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

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

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

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

Ответы [ 3 ]

21 голосов
/ 19 апреля 2009

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

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

4 голосов
/ 31 октября 2009

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

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

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

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

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

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

2 голосов
/ 25 сентября 2011

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

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

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

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

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

...