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

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

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

http://theopensourceu.com/wp-content/uploads/2009/04/one-xib-multiple-views.png

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

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


person Frank V    schedule 19.04.2009    source источник


Ответы (3)


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

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

person Adam Rosenfield    schedule 19.04.2009
comment
Я немного не понимаю, в чем разница между представлением и XIB. Для (реального) примера, скажем, мне нужно что-то реализовать с видом карты вверху, 3 кнопками внизу и различными элементами управления посередине в зависимости от условия. Этой серединой может быть а.) Метки, отформатированные определенным образом, или б.) Изображение и меньше меток, отформатированные иным образом. Я думал, что 3 представления - одно представление для обработки каждой из этих групп элементов управления (карта, условные элементы управления, кнопки). Что лучше: сделать 3 представления в одном XIB или просто поместить все элементы управления в одно представление? - person Danny; 12.12.2012
comment
Конечно, вы не должны помещать каждое представление в один XIB, но он спросил, есть ли причина, по которой вы не должны этого делать вообще. Определенно есть моменты, когда это полезно. - person Glenn Maynard; 14.11.2013

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

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

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

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

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

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

person Erick Robertson    schedule 31.10.2009

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

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

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

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

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

person Steve HHH    schedule 25.09.2011