UiViewController - Pop не появляется - PullRequest
0 голосов
/ 23 сентября 2011

Я отображаю подкласс UIControllerView, когда кнопка нажата из другого UIViewController, как это:

- (IBAction)openNextLevelViewController
{
    NSLog(@"openNextlevelViewController");

    [self.navigationController pushViewController:nextLevelViewController animated:YES];

}

И приложение вернется из этого представления при нажатии кнопки, которая вызывает этот метод:

-(IBAction) returnToStart {

    NSLog(@"returnToStart method called");
    [self.navigationController popViewControllerAnimated:YES];

}

Проблема заключается в том, что отображаемое представление не уничтожается / не удаляется из всплывающего окна.В результате, когда он выдвигается, он не выполняет viewDidLoad, который инициирует некоторые переменные.Это может вызывать связанную проблему, когда во второй раз, когда пользователь нажимает кнопку возврата, «всплывающее окно» больше не вызывает возврат к предыдущему контроллеру.

Какой лучший способ справиться с этим?Я мог бы переместить код инициализации в метод willAppear, но кажется, что это можно было бы вызвать почти случайно.

1 Ответ

2 голосов
/ 23 сентября 2011

Что ж, его не выпускают, потому что nextLevelViewController все еще сохраняется где-то еще.Скорее всего, в вашей переменной nextLevelViewController.

- (IBAction)openNextLevelViewController
{
    NSLog(@"openNextlevelViewController");
    // assuming you have nib already set up
    UIViewController *nextLevelViewController = [[NextLevelViewController alloc] init]; 
    // RETAIN COUNT = 1

    // navigationController retains your controller
    [self.navigationController pushViewController:nextLevelViewController animated:YES]; 
    // RETAIN COUNT = 2

    // Don't need it any more let navigation controller handle it.
    [nextLevelViewController release]
    // RETAIN COUNT = 1 (by NavigationController)
}

Далее

-(IBAction) returnToStart {
    [self.navigationController popViewControllerAnimated:YES];
    // RETAIN COUNT = 0, dealloc will be called on your viewController, make sure to release all your retained objects.
}

Теперь, когда ваш контроллер отключен, он ДОЛЖЕН быть освобожден (его не следует хранить где-либо еще).И в следующий раз, когда вы вызовете openNExtLevelViewController, он все равно будет инициализировать новый экземпляр вашего viewController.

Я поклонник выпуска viewController, когда он больше не нужен (отображается), вместо того, чтобы держать его в памяти,Пусть navigationController и TabBarController обрабатывают viewControllers всякий раз, когда это возможно.

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