Изменение rootViewController UIWindow
Когда мое приложение сначала загружается, я устанавливаю свойство rootViewController
моего UIWindow
на controllerA
.
Когда-нибудь во время моего приложения я решил изменить rootViewController
на controllerB
.
Проблема в том, что иногда, когда я делаю переход в controllerB
, я вижу controllerA
представление за ним. По какой-то причине этот вид не удаляется. Еще более тревожным является то, что после установки метода rootViewController
в controllerB
метод controllerA
dealloc
никогда не запускается.
Я попытался удалить подзоны UIWindow
вручную, прежде чем переключиться на controllerB
, что решает проблему просмотра controllerA
представлений в фоновом режиме, но controllerA
dealloc все равно никогда не будет вызван. Что происходит здесь?
Яблоки говорят:
Контроллер корневого представления предоставляет представление содержимого окна. Назначение контроллера представления этому свойству (программно или с помощью 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;
}
Ответы
Ответ 1
Оказывается, есть две отдельные проблемы. 1) У меня был цикл сохранения в контроллере A, поэтому он никогда не получал dealloc'd. Во-вторых, чтобы изменить контроллер корневого представления, вы должны сначала удалить подвид окна (даже если документы предлагают иначе)
Ответ 2
Проблема может быть в вашей реализации ControllerA или ControllerB, они могут сохранить "я" в коде, поэтому ARC can not автоматически отключит вас ViewController. Можете ли вы опубликовать реализацию ControllerA и ControllerB.