2012-07-01 3 views
2

Важно знать, что я думаю, что я использую раскадровки. Я делаю следующее didFinishLaunchingWithOptions:Раскадровка - initWithCoder получает вызов дважды

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil]; 

FirstView *mvc = [sb instantiateViewControllerWithIdentifier:@"FirstView"]; 
SecondView *tvc = [sb instantiateViewControllerWithIdentifier:@"SecondView"]; 

NSArray* controllers = [NSArray arrayWithObjects:[self addNavigationToViewController:mvc], [self addNavigationToViewController:tvc], nil]; 

// add controllers to a table view 
UITabBarController *tb = [[UITabBarController alloc] init]; 
[tb setViewControllers:controllers]; 

[self.window setRootViewController:tb]; 

addNavigationToViewController это метод я использую для того, чтобы встроить контроллер представления внутри UINavigationController

Когда я запускаю это приложение initWithCoder в FirstView вызывается дважды. Я нашел причину, но я не знаю, как это сделать правильно.

В основном FirstView становится инициализируется один раз из-за его Начальная сцена (есть галочка в Attributes Inspector, который устанавливает вид «Является ли первоначальный контроллер представления») и второй раз:

FirstView *mvc = [sb instantiateViewControllerWithIdentifier:@"FirstView"]; 

Если снять галочку Начальная сцена жалуется, что «возможно, назначенная точка входа не установлена».

Я делаю что-то неправильно, но я понятия не имею, что это такое.

Любой намек был бы оценен.

+0

У меня точно такая же проблема ... пока я никогда не называю метод "instantiateViewControllerWithIdentifier". Я использую «чистую» раскадровку (например, никакой контроллер не создается в исходном коде). Любая идея, почему метод «initWithCoder» вызывается дважды? – CedX

ответ

4

В приложении, использующем раскадровки, при запуске приложения UIKit просматривает информационный план для the UIMainStoryboardFile key. Если он установлен, UIKit ссылается на эту раскадровку и использует - [UIStoryboard instantiateInitialViewController], чтобы создать контроллер корневого представления по умолчанию для прикрепления к окну.

UIKit делает это, а затем позже в -didFinishLaunchingWithOptions :, вы также создаете новый экземпляр вашего контроллера вида. Вот почему он создается дважды.

Если вы хотите полностью настроить этот процесс, и он выглядит так, как вы, то вы, вероятно, не хотите, чтобы UIKit выполнял эти действия по умолчанию от вашего имени. Вы можете просто удалить ключ UIMainStoryboardFile (ы) с вашего info.plist, и переопределения в -didFinishLaunchingWithOptions :, вы можете:

  1. Создать окно
  2. Grab раскадровка
  3. вид Instantiate контроллер (s) из раскадровки.
  4. Установите контроллер корневого представления для окна.
  5. Сделайте ключ окна и виден.
+0

Это имеет смысл. спасибо – yacana

0

Если нет каких-либо причин, кроме того, о чем вы упоминали, вам, вероятно, вообще не нужно звонить instantiateViewControllerWithIdentifier. Если вы используете раскадровки, в большинстве случаев вы можете (должны) определить свои контрольные контроллеры UITabBarController в своем раскадровке и иметь свой MainTabBarController в качестве «Контроллера начального просмотра». Вы также вставляете свои контроллеры просмотра в навигационные контроллеры в раскадровку.

+0

Частично верно.Я могу делать все визуально, но должен быть действительный способ делать вещи только с кодом. Раскадровки хороши, но я люблю их за то, что они сохраняют материал UI в одном месте. Ваш ответ дал мне идею, и я попробую еще раз. Спасибо – yacana

Смежные вопросы