init root viewcontroller вызывает сбой

Я использовал приведенные ниже коды для инициализации контроллера корневого представления.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

{

[window addSubview:rootViewController.view];
UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController: rootViewController  ];
}

оно хорошо работало на ios 4 около 2 лет, ios 5 1 год, при запуске приложения проблем не возникало, но на ios 6 оно вылетало и сообщалось

* Завершение работы приложения из-за необработанного исключения "UIViewControllerHierarchyInconsistency", причина: "добавление корневого контроллера представления в качестве дочернего элемента контроллера представления:"

Приветствую любой комментарий


person arachide    schedule 27.09.2012    source источник
comment
Является ли ваш rootViewController уже дочерним элементом другого viewController? или это rootViewController в окне?   -  person iSofTom    schedule 27.09.2012


Ответы (2)


«rootViewController» уже находится в вашей иерархии представлений. Сначала удалите его из любого другого контейнера (window.rootViewController?) (window.rootViewController = nil).

person David H    schedule 27.09.2012
comment
Несколько связанный вопрос: является ли вызов UINavigationController-init законным, или мне нужно вызывать -initWithRootViewController:? Если последнее, законно ли передавать ноль? - person nmr; 21.10.2012
comment
Apple говорит, что предпочтительный инициализатор должен быть предпочтительным. Однако можно представить, что он просто устанавливает корневой контроллер, поэтому, вероятно, будет нормально использовать метод «initWithFrame», а затем установить свойство. Но потом спросите себя, зачем это делать? Когда вы отклоняетесь от линий, вы увеличиваете вероятность будущих проблем. Мое приложение дважды было бито iOS6 из-за незначительного отклонения. YMMV. - person David H; 21.10.2012

В своем коде вы добавляете представление rootViewController в окно, а затем сразу же пытаетесь добавить представление rootViewController в новый UINavigationController. Вместо этого попробуйте следующее:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    ...    

    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:rootViewController];
    [window addSubview:nav.view];

    ...
}

или еще лучше:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    ...    

    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:rootViewController];
    window.rootViewController = nav;

    ...
}

... должны показать, что это неполные примеры -application:didFinishLaunchingWithOptions:. Вам нужно убедиться, что вы включили создание своего UIWindow и вызов -makeKeyAndVisible на нем.

person Adam Swinden    schedule 27.09.2012