Как освободить uiviewcontroller / выгрузить представления о выходе из системы - PullRequest
6 голосов
/ 05 января 2012

Я думаю, что это довольно распространенный вариант использования, который я видел в нескольких приложениях.Но, проведя пару дней, я все еще борюсь с этим.У меня есть такая структура:

UITabBarController
-- UINavigationController1
 ---- UITableViewController1

-- UINavigationController2
---- UITableViewController2

Теперь у меня есть кнопка выхода из системы на UITableViewController2.Когда я нажимаю на эту кнопку выхода из системы, я хочу, чтобы все и любой view-контроллер были освобождены, все представления выгружены.В основном начать все заново, как запуск приложения.Я в основном хочу, чтобы viewDidLoad на каждом из этих UITableViewController вызывался снова.

Я пытался вызвать следующий метод в моем appdelegate при выполнении действия выхода из системы на UITableViewController2.1009 *

Но, увы, это не похоже на работу?

Есть идеи, как этого добиться?Также я вижу различное поведение в iOS4 по сравнению с iOS5 с visibleViewController.Я не использую модальный viewcontroller здесь.Есть ошибки?

Обновление: Я не использую ARC

спасибо, mbh

Ответы [ 3 ]

2 голосов
/ 06 января 2012

Ваш цикл for освободит и, таким образом, освободит все контроллеры представления, которые вы вставили в соответствующие корни UINavigationController (в зависимости от того, сколько у вас вкладок), т. Е. У них не будет суперпредставления, когда вы вернетесь к корнюкаждый контроллер навигации освобождается автоматически.Об этих ваших UITableViewControllers позаботились.

Что касается соответствующих UINavigationControllers, вам понадобится ваш контроллер табуляции для освобождения старого экземпляра.ИМХО, это должно быть сделано для вас, когда вы выпускаете UITabBarController.

После этого UITabBarController остается сам.Я не думаю, что это можно сделать.Ваш код удалит только представление, но не освободит сам контроллер панели вкладок.И, как указывает Кришна К, вам нужен хотя бы один контроллер представления, чтобы перезагрузить все остальные.Вставка кода в appdelegate имеет смысл, но вы должны убедиться, что ваш выход из системы () не вызовет сохранение для UITableViewController2, а также для UITabbarController, так как он вызывается из UITableViewController2 где-то.Ваш AppDelegate содержит экземпляр для TabBar-Controller, который вы можете освободить и создать новый экземпляр после удаления представления из self.window?

// manually create UITabBarController - AppDelegate holds instance
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    mytabcontroller=[[UITabBarController alloc] initWithNibName:@"foo" bundle:nil];
}

- (void) logout {
  [self.tabBarController.view removeFromSuperview];
  [mytabcontroller release];
  mytabcontroller=[[UITabBarController alloc] initWithNibName:@"foo" bundle:nil];
  [self.window addSubview:self.tabBarController.view];
}

Но, как я уже сказал, могут быть оговорки с управлением памятьюна данный момент.

1 голос
/ 05 января 2012

Ваш rootViewController для обоих контроллеров навигации является их соответствующими контроллерами TableView.Поэтому я не думаю, что popToRootViewController будет делать что-либо.

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

1 голос
/ 05 января 2012

Вам необходимо освободить ваши контроллеры вида. Когда вызывается их метод release, этот метод должен включать в себя операторы для освобождения всех ресурсов своего объекта (а также освобождения своего суперкласса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...