Когда я должен инициализировать контроллер представления с помощью initWithNibName?

Когда должен я использовать init: и когда должен я использовать initWithNibName:bundle: при создании контроллера представления?

48
задан nevan king 25 February 2013 в 05:20
поделиться

2 ответа

Одной из проблем, с которой я столкнулся с долгосрочным экземпляром Trac, является поле "version". Нет различий между списком версий, которые могут быть назначены мандату, и списком версий, которые могут быть запрошены в пользовательском интерфейсе запроса. Так что если список версий для этого поля начинает становиться громоздким, вы не можете обрезать его, не ограничивая то, что вы можете искать.

В один из этих дней я собираюсь исправить это...

Trac 0,11 скорее является "скачкообразным" ресурсом, чем 0,10; в значительной степени благодаря переключению на Genshi для шаблонного двигателя. Вы можете следить за ресурсами на сервере, в частности за памятью. Я ожидаю увидеть некоторое повышенное внимание, уделяемое производительности в 0,13 или около того.

О, и если вы столкнетесь с проблемами, # trac на freenode может быть хорошим ресурсом.

Раскрытие информации: Я являюсь одним из разработчиков Trac

-121--2953967-

Возможно, что-то сохраняется на .resx формы вместо .designer? Я не могу себе представить почему это так, но да...

Если все остальные ошибки не удается, попробуйте удалить ListView из формы. Затем создайте новую нежелательную форму в вашем проекте, воссоздав ListView на нежелательной форме, проверьте нежелательную форму, чтобы убедиться, что вы не получили странное поведение вуду, а затем скопируйте ListView из нежелательной формы обратно в вашу реальную форму?

Ужасно запутанный, я знаю...

-121--2850114-

-initWeyNibName: bundle: является назначенным инициализатором для UIViewController. Что-то должно в конце концов так и называться. Тем не менее, несмотря на примеры Apple (которые во многих случаях предпочитают краткость по сравнению с ремонтопригодностью), его никогда не следует вызывать извне самого контроллера вида.

Вы часто увидите код так:

MYViewController *vc = [[MYViewController alloc] initWithNibName:@"Myview" bundle:nil];

Я говорю, что это неправильно. Он помещает детали реализации (имя NIB и тот факт, что NIB даже используется) в вызывающего абонента. Это разрывает инкапсуляцию. Правильный способ сделать это:

MYViewController *vc = [[MYViewController alloc] init];

Затем в MYViewController:

- (instancetype)init
{
   self = [super initWithNibName:@"Myview" bundle:nil];
   if (self != nil)
   {
       // Further initialization if needed
   }
   return self;
}

- (instancetype)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle
{
    NSAssert(NO, @"Initialize with -init");
    return nil;
}

Это перемещает сведения о реализации ключа обратно в объект и предотвращает случайный разрыв инкапсуляции вызывающими абонентами. Теперь при изменении имени NIB или переходе к программному построению он фиксируется в одном месте (в контроллере вида), а не в каждом месте, где используется контроллер вида.

137
ответ дан 7 November 2019 в 12:07
поделиться

Используйте initWithNibName: bundle: , если вы ... инициализируете с помощью файла пера! То есть файл, созданный с помощью Interface Builder.

Если вы не используете IB для компоновки ваших представлений, вы можете просто использовать init .

7
ответ дан 7 November 2019 в 12:07
поделиться