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

UIViewController (init и initWithNibName)

Пожелайте узнать больше о практических различиях между init и initWithNibName. SO ответы, такие как , указывают на то, что лучше коснуться "initWithNibName" косвенно через "init".

  • Существуют ли какие-либо обстоятельства, которые нам необходимо определить "init" и "initWithNibName" по-другому?
  • Возможно ли, что любой файл Nib должен быть загружен более одного раза во время выполнения одной программы?
  • Связаны ли вопросы 1 и 2?
4b9b3361

Ответ 1

Не лучше коснуться initWithNibName: через init. Вы просто хотите вызвать initWithNibName: в какой-то момент. Вы можете делать это извне или внутренне. Некоторые считают, что лучше сделать это внутри. У меня на самом деле есть класс под названием "LayoutUtil", который я поддерживаю вспомогательными методами, связанными с компоновкой, чтобы многократно писать утомительный фрагмент кода, связанного с компоновкой. Вот мой код для загрузки UIViewController:

+ (id)loadController:(Class)classType {
    NSString *className = NSStringFromClass(classType);
    UIViewController *controller = [[classType alloc] initWithNibName:className bundle:nil];
    return controller;
}

И тогда я могу просто сделать:

MyViewController *c = [LayoutUtil loadController:[MyViewController class]];

Если вы хотите, вы можете добавить метод класса ughhhh в класс и называть его там, это не имеет значения. Дело в том, что не рекомендуется использовать initWithNibName в методе init, но вы просто хотите удостовериться, что вы вызываете его в какой-то момент при запуске UIViewController.

- (id)ughhhh
{
   self = [super initWithNibName:@"Myview" bundle:nil];
   if (self != nil)
   {
   }
   return self;
}

Файл nib определенно может быть загружен более одного раза. Каждый раз, когда вы вызываете initWithNibName в UIViewController, необходимо загружать xib. Многие люди загружают UIView, которые не принадлежат UIViewController, как это:

[[NSBundle mainBundle] loadNibNamed:@"nameOfXIBFile" owner:self options:nil];

Каждый раз, когда вы вызываете эту функцию, вы загружаете наконечник.

Существуют случаи, когда кеш может быть кеширован. Примером может служить UITableView - но представление таблицы реализует собственный кеш. Операционная система автоматически не выполняет кэширование.

init и initWithNibName: связаны тем, что initWithNibName: автоматически вызывает init для объекта.

Ответ 2

Не лучше "initWithNibName" вызвать "косвенно" через "init". Вы должны использовать тот, который лучше подходит вашим потребностям. Высказывание [[UIViewController alloc] init] в точности похоже на высказывание [[UIViewController alloc] initWithNibName:nil bundle:nil], поэтому, если это аргументы, которые вы хотите передать, вы также можете использовать [[UIViewController alloc] init].

Отвечая на ваши вопросы:

  • Вы можете определить init и initWithNibName:bundle: по-разному, если хотите. Вы можете определить только один из них. Например, UIImagePickerController определяет только init, и если вы попытаетесь отправить его initWithNibName:bundle:, он не будет работать должным образом. Или вы можете определить какой-то совсем другой метод init.... Например, UINavigationController определяет только initWithRootViewController:. Независимо от того, какие методы init вы определяете, необходимо в конечном итоге вызвать один из его методов суперкласса init.

  • Да, наконечник можно загружать несколько раз. Если вы создаете несколько экземпляров одного и того же подкласса контроллера, вероятно, вы будете загружать один и тот же nib несколько раз. Фактически, один экземпляр контроллера представления может загружать его nib несколько раз. Как? Если в настоящее время на экране не отображается вид контроллера контроллера, и система работает с низким объемом памяти, система попросит диспетчер представлений высвободить его представление. Если позже диспетчеру просмотра необходимо вернуть свой вид на экран, он снова загрузит пин.

  • Вопросы 1 и 2 не связаны.

Ответ 3

Ответ на первый вопрос

В идеале каждый initWithNibName вызывает init внутренне, поэтому вам не нужно определять оба в сценарии обычного случая, но вы можете, если View также загружен из loadView в одном случае и fron Nib, а также в другом случае из разные взгляды.

Ответ второго вопроса

Everytime View вставляется в Stack Nib загружен

Ответ третьего вопроса

Нет