Про IB, init, load view и view загрузили? - PullRequest
0 голосов
/ 23 января 2011

это довольно общий вопрос, но я хочу понять это, пожалуйста -

Я обычно создаю свои приложения без использования IB.

  1. Каковы преимущества и недостатки использованияIB или создание интерфейса программно?
  2. какие угнетения / код подходят для метода init и что для метода loadView?
  3. есть ли разница между loadView и ViewDidLoad или мне нужно использовать толькоодин из них?

спасибо Шани

Ответы [ 3 ]

3 голосов
/ 23 января 2011

Во-первых, перья - это гораздо меньше работы.Если у вас есть огромный блок раннего кода, состоящий из множества «создайте эту метку; установите размер шрифта на 14; поместите его в (12,12; 128x96)», тогда у вас есть хороший кандидат для загрузки с пера.

Два: Для объектов в перо, которое init вызывается при загрузке кончика, и связанные методы могут быть неочевидными.Я нашел следующие правила:

  • Объекты классов с прямой поддержкой IB (UIViews, встроенные UIViewControllers) создаются с помощью initWithCoder:.Это обходит обычный назначенный инициализатор, потому что IB фактически создает экземпляр этого объекта в реальном времени, пока вы редактировали кончик (предположительно, с помощью обычного назначенного инициализатора), а затем сериализует его.Это имеет значение, когда вы подклассифицируете эти классы: только экземпляр базового класса UIKit был создан и сериализован в IB, поэтому ваши инициализаторы полностью обойдены.Однако, см. Ниже.

  • Объекты, созданные с помощью заполнителей - оранжевый (или синий) куб "NSObject" - создается с обычным init.Это потому, что IB не может создавать экземпляры только для любого класса;поэтому он сериализует «объект-заполнитель» в перо, которое затем заменяется на свежий init -объявленный экземпляр нужного класса при загрузке кончика.Однако:

  • Оба вышеперечисленных вызывают awakeFromNib. Таким образом, вы можете выполнить любую специальную настройку, которая вам нравится, если этот объект всегда будет создан изпероС осторожностью вы можете создать общий метод настройки и вызывать его как из awakeFromNib, так и из ваших не init инициализаторов, чтобы иметь возможность использовать класс из пера или без него.

  • Конечно, ни один из вышеперечисленных не относится к «владельцу файла», который был создан, как вы хотите, и существует до загрузки пера.

Три: В UIViewController,loadView выполняет фактическую загрузку файла пера (и обеспечивает одно пустое представление, если файла пера нет.) Переопределите, если вы хотите создать свои представления другим способом.Если вы хотите изменить или добавить к тому, что было загружено из пера, viewDidLoad - лучшее место для этого: есть обстоятельства, когда loadView никогда не вызывается, но viewDidLoad все еще есть.(например, когда VC и его представление создаются в одном и том же перо; есть причина, по которой Apple рекомендует против этого, хотя иногда это удобно.) viewDidLoad также хорошо сбалансирован с viewDidUnload, поэтому материал, выделенный в viewDidLoadможно и нужно выпустить в viewDidUnload.

Перья заслуживают изучения.Как только вы освоитесь, вы полюбите их;есть причина, по которой они с 1989 года.

1 голос
/ 23 января 2011
  1. Плюсы - это быстрее оторваться от земли, вы можете отрегулировать позиции подпредставлений обычно быстрее и определенно проще. Минусы: вы ограничены тем, что вы можете сделать в Интерфейсном Разработчике, что меньше, чем вы можете достичь в коде почти всегда. Плюс взаимодействие между тем, как некоторые представления ведут себя из IB, может привлечь новых пользователей.
  2. init и его тезки должны использоваться только для установки нормальных значений по умолчанию для иваров. loadView используется для настройки иерархии вида, начиная с вида сзади вашего контроллера представления. Т.е. специальная заметка; не ссылайтесь на свойство self.view, если вы не устанавливаете его, это приведет к бесконечному циклу. Просто дружеский протип.
  3. Как упоминалось ранее, loadView используется для настройки вашего вспомогательного представления (оно должно быть создано вами, если вы переопределите его), и viewDidLoad вызывается после загрузки представления (после вызова loadView) , Вы делаете соответствующие предметы в соответствующих местах.
0 голосов
/ 23 января 2011

Некоторые люди скажут, что написание ViewController в коде было бы "проще" и ускорило бы загрузку приложения, поскольку ему не нужно загружать файл при запуске. Хотя это верно в зависимости от размера .xib, если вы разработчик, который знает, как написать приложение во всем коде, создание приложения с расширением .xib будет намного проще и быстрее, потому что вам не нужно сделать объект

UISomething *smthng = [[UISomething alloc] initWithFrame:CGRectZero];
[smthng doSoemthing:nil];
//ect ect...

снова и снова для создания вашего пользовательского интерфейса.

Что касается loadView и viewDidLoad, Apple говорит, что loadView предназначена для программной загрузки вида, но вы все равно можете использовать его для .xibs

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