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

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

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

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

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

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

Заранее благодарю

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

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

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