2013-08-19 5 views
0

У меня есть пошаговая игра, которая позволяет пользователю играть одновременно во многих матчах. После того, как был сделан поворот, пользователь может нажать кнопку «Перейти к следующему совпадению».Обновить UIViewController и Dealloc

При нажатии кнопки я просто создаю новый GameViewController и нажимаю его. Однако при этом старый GameViewControlller не будет dealloc и иногда сопряжен с новым viewController (как блоки, выполняющие увеличение счета на контроллере oldView, увеличивает счет на новом).

Причина, по которой я хочу нажать новый viewController вместо nuke и очистить старый, и повторно использовать его, потому что я хочу анимацию push, и по соображениям безопасности я хочу чистый.

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

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle: nil]; 
      GameViewController *gameViewController = (GameViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"GameViewController"]; 
      gameViewController.matchObject = match; 
      [weakSelf.navigationController pushViewController:gameViewController animated:YES]; 

Заранее спасибо

+1

Вы пробовали NSLog в методе dealloc, чтобы узнать, вызвано ли это? – ahmedalkaff

ответ

1

Вы толкая новый экземпляр GameViewController но ваш старый контроллер не будет уничтожен, поскольку он хранится в стеке контроллеров навигации , Существует потенциальная утечка памяти - если вы нажимаете новый контроллер на каждый ход и никогда не будете его всплывать.

Вы можете напрямую обновить навигационный стек после завершения новой анимации контроллера, изменив свойство UINavigationController.viewControllers. (например, что-то вроде

// I assume you using ARC. 
NSMutableArray *temp = [NSMutableArray array]; 
[temp addObjectsFromArray:self.navigationController.viewControllers] 
[temp removeObjectAtIndex:temp.count - 2]; 
self.navigationController.viewControllers = [temp copy]; 

но это решение делает все равно не выглядит хорошо для меня)

Вы можете использовать хороший толчок переход без навигационного контроллера, пожалуйста, посмотрите на CATransition класса.

+0

Спасибо! Это сработало. Нужно установить задержку для удаления, и пусть новая загружается. – BlackMouse

0

Если вы просто нажать на новый контроллер представления старый контроллер представления еще будет там. Это просто не будет видно, потому что новый сверху. Вы могли бы попробовать что-то вроде этого (если вы еще не снимаете старый контроллер представления где-то еще):

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle: nil]; 
GameViewController *gameViewController = (GameViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"GameViewController"]; 
gameViewController.matchObject = match; 
[weakSelf.navigationController popViewControllerAnimated:NO]; 
[weakSelf.navigationController pushViewController:gameViewController animated:YES]; 
+0

Я считаю, что текущий контроллер будет уничтожен после этой строки '[weakSelf.navigationController popViewControllerAnimated: NO];', лучше использовать переменную 'strong'. –

+0

Разве это не то, чего хочет OP? Он хочет, чтобы dealloc был вызван, поэтому я предполагаю, что он хочет, чтобы его уничтожили. – Kevin

+0

После строки '[weakSelf.navigationController popViewControllerAnimated: NO];' строка '[weakSelf.navigationController pushViewController: gameViewController animated: YES];' не имеет смысла, потому что 'weakSelf' будет нулевым, и он не сможет получить доступ к 'navigationController' –