2014-11-07 2 views
4

В моем приложении я программно меняю контроллеры корневого представления на основе действий пользователя, например. логин/выход.UIWindow setRootViewController не очищает существующую иерархию

В iOS 8 - Я замечаю странную проблему. Даже после установки rootViewController в окне прежняя иерархия сохраняется. Я просто проверил его, захватив иерархию представлений.

- (void) logout{ 
    [self.window setRootViewController:[self loadLoginView]]; 
} 

-(UIViewController *) loadLoginView{ 
     WelcomeScreenVC *wsVC; 
     wsVC = [[WelcomeScreenVC alloc] initWithNibName:@"WelcomeScreenVC" bundle:nil]; 
     UINavigationController *onboardingVC = [[UINavigationController alloc]initWithRootViewController:wsVC]; 
     return onboardingVC; 
} 

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

Edit: Я просто смотрел на UIWindow setRootViewController документации и вот что Apple, должен сказать об этом:

Корневая-контроллер обеспечивает представление содержимого окна. Назначение контроллера вида для этого свойства (либо программно , либо с помощью Interface Builder) устанавливает вид контроллера представления как вид содержимого окна . Если в окне есть существующее представление , иерархия, старые виды удаляются до того, как установлены новые .

+0

Можете ли вы поделиться кодом для '[self loadLoginView]' пожалуйста? –

+0

@JoshHeald добавила его на вопрос –

+0

Это скопировано из вашего приложения напрямую, или вы написали его? Я спрашиваю, потому что 'loadLoginView' объявляет тип возврата' void', что не помогло бы вопросам –

ответ

2

Я заметил ту же самую вещь.

В принципе, у меня довольно сложная раскадровка, которая действует как интерфейс входа/приема. Этот интерфейс находится в навигационном контроллере, который представляет собой другой навигационный контроллер.

После определенного момента пользователь предпринимает действие, которое переводит его на главный интерфейс. Используя отладчик представления iOS 8, я заметил, что прежняя иерархия представлений все еще была вокруг после установки свойства rootViewController этого окна.

Мое решение, потому что теперь это использовать следующий код, прямо перед тем, как повторно Ассинг свойство window.rootViewController:

for (UIView* subView in self.window.rootViewController.view.subviews) { 
    [subView removeFromSuperview]; 
} 
[self.window.rootViewController.view removeFromSuperview]; 

Это не красиво, но это работает.

Еще одна странная вещь, которую я заметил, заключается в том, что модально представленный viewController приветственного интерфейса неправильно очищается с использованием этого метода. Я должен вручную уволить его и сделать это.

+0

, похоже, это работает с точки зрения отображаемого пользовательского интерфейса, но на правильном экране теперь нет взаимодействия для некоторых причина ..поэтому я не могу нажать любую из кнопок или текстовых полей ... любые идеи? Раньше у меня была аналогичная проблема, когда правильный пользовательский интерфейс не показывался, а предыдущий пользовательский интерфейс несколько не реагировал, поэтому элементы панели табуляции показывали, что они были выбраны, но не повлияли на какие-либо их изменения. – CMash

+0

Получил альтернативное решение для моей ситуации, когда мы заменили контроллер корневого представления, когда выполнялся длительный набор сетевых подключений, и я остался бы старым пользовательским интерфейсом (если бы я был достаточно быстрым), с функциональными кнопками, но панель вкладок кнопки, не изменяющие вид контроллера табуляции. CGRect windowFrame = self.window.frame; self.window.rootViewController = nil; self.window = nil; UIWindow * newWindow = [[UIWindow alloc] initWithFrame: windowFrame]; [newWindow makeKeyAndVisible]; self.window = newWindow; – CMash

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