2013-07-13 2 views
23

Когда мое приложение загружается первым, я установил свойство rootViewController моего UIWindow в controllerA.Изменение rootViewController UIWindow

Когда-нибудь во время моего приложения я решил изменить rootViewController на controllerB.

Проблема в том, что иногда, когда я делаю переход в controllerB, я вижу вид controllerA. По какой-то причине этот вид не удаляется. Еще больше беспокоит то, что после установки rootViewController на controllerB метод никогда не запускается.

Я попытался удалить подвиды из UIWindow вручную перед переключением на controllerB, что решает проблему увидеть controllerA «s мнения в фоновом режиме, но controllerA» dealloc s еще никогда не вызывается. Что здесь происходит ????

яблоки документы говорят:

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

UPDATE

Вот код моего AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [self showControllerA]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

- (void)showControllerA 
{ 
    ControllerA* a = [ControllerA new]; 
    self.window.rootViewController = a; 
} 

- (void) showControllerB { 
    ControllerB* b = [ControllerB new]; 
    self.window.rootViewController = b; 
} 
+0

Можете ли вы предоставить код для вашего метода 'application: didFinishLaunchingWithOptions:' в делете приложения? – Cezar

+0

Глупый вопрос, но вы устанавливаете 'controllerA' на нуль, когда вы нажимаете второй контроллер? Если нет, то это не будет отменено. (Я предполагаю, что вы) – Putz1103

+0

Я никогда не держу указатель на контроллер, поэтому не уверен, что я установил бы в ноль. – aloo

ответ

11

Оказалось, что существуют две отдельные проблемы. 1) У меня был цикл сохранения в контроллере A, поэтому он никогда не получал dealloc'd. Во-вторых, чтобы изменить контроллер корневого представления, вы должны сначала удалить подзоны Windows (даже если документы предлагают иначе)

1

Проблема может быть в вашей реализации ControllerA или ControllerB, они могут сохранить 'себя' в коде так АРК Невозможно автоматически отключить ViewController. Можете ли вы опубликовать версию ControllerA и ControllerB.

+0

Это объясняет, почему вызов dealloc не вызван. Но почему представление контроллера еще должно быть видно за контроллером Б. Не меняет ли контроллер корневого представления удалить вид контроллера из окна? – aloo

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