Как сохранить контроллеры от XIB - PullRequest
3 голосов
/ 26 мая 2009

Как новичок, IB и все возможные связи сбивают меня с толку. Большинство уроков, которые я нашел, - это то, что я бы назвал реинкарнацией кода спагетти, в котором запутанность - это все соединения, созданные перетаскиванием. Конечно, я хочу использовать IB для компоновки видов (определения размера и размещения визуальных элементов), для этого IB отлично подходит. Но контроллер не является представлением, так что это менее запутанно, если все мои контроллеры являются исключительно кодом и не появляются нигде в IB. Я подозреваю, что это сведет к минимуму спагетти. Это также поощряет предостережение одного сибса за просмотр. Для этого, и вот вопрос, где я могу найти примеры проектов, которые придерживаются этой стратегии?

Ответы [ 2 ]

4 голосов
/ 26 мая 2009

У меня нет набора примеров проектов, но я дам вам некоторую информацию о том, как все работает и когда вам следует создавать контроллеры в файле XIB или в коде.

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

Механизм, который IB предоставляет для решения этой проблемы, является владельцем файла. Освоение Владельца файла необходимо для получения Интерфейсного Разработчика.

Владелец файла - это не объект, который находится "в" файле XIB, это объект, который представлен в файле XIB. Это заполнитель для объекта, который уже будет существовать при загрузке файла XIB. Когда файлы NIB загружаются во время выполнения, они загружаются с помощью метода NSBundle - [NSBundle loadNibNamed: ownwer: options:]. Параметр owner используется для разрешения объекта-заполнителя владельца файла в файле XIB / NIB. Когда файл загружается во время выполнения, все соединения, выполненные с владельцем файла, будут сопоставляться с объектом, который вы передали в качестве параметра владельца методу NSBundle. На iPhone вы обычно не загружаете файл NIB самостоятельно. Вместо этого UIViewController делает это за вас. Реализация по умолчанию метода loadView UIViewController может выглядеть примерно так:

- (void)loadView {
    [[self nibBundle] loadNibNamed:[self nibName] owner:self options:nil];
}

Итак, подключив элементы в вашем файле XIB к владельцу файла, вы будете подключать их к контроллеру представления.

В вашем приложении будут статические контроллеры - они будут жить вечно. Контроллер навигации или вкладки вместе с их корневыми элементами обычно живы в течение всей жизни своего приложения. В таком случае я бы настроил эти контроллеры представления в файле MainWindow.xib. Большинство других контроллеров будут создаваться динамически и программно в ответ на действия пользователя.

1 голос
/ 26 мая 2009

Хороший вопрос. Шаблон, который я пытаюсь придерживаться, заключается в создании контроллера в коде, добавлении IBOutlets и IBActions для вещей в XIB / NIB, которые взаимодействуют с этим кодом, и в конструкторе контроллера, который загружает XIB / NIB с «self» как владелец, и в IB я соединяю вещи с местозаполнителем «Владелец файла», личность которого я буду указывать как класс моего контроллера.

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