2013-08-19 57 views
0

我有一个回合制游戏,允许用户同时玩很多比赛。转了一圈之后,用户可以点击“转到下一个匹配”按钮。重新加载UIViewController和Dealloc

单击按钮时,我只是创建一个新的GameViewController,并将其按下。但是,在执行此操作时,旧的GameViewController将不会释放,并且有时会干扰新的viewController(与执行在oldView控制器上增加分数的块一样,会增加新控件的分数)。

我想推新视图控制器而不是核弹并清理旧视图并重新使用它的原因是因为我想要推动动画,并且出于安全原因,我想要一个干净的视图。

所以我想当创建和推动一个新的viewcontroller,它不是一个真正的新的,但旧的。

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

在此先感谢

+1

你有没有在dealloc方法中试过NSLog,看它是否被调用? – 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' –

相关问题