0

我有一个回合制游戏,允许用户同时玩多场比赛。在轮到之后,用户可以点击“转到下一场比赛”按钮。

单击按钮时,我只是创建了一个新的 GameViewController,然后将其推送。但是,这样做时,旧的 GameViewController 不会解除分配,有时会干扰新的 viewController(就像在 oldView 控制器上执行增加分数的块一样,会增加新控制器的分数)。

我想要推送一个新的 viewController 而不是 nuke 并清理旧的 viewController 并重用它的原因是因为我想要推送动画,并且出于安全原因,我想要一个干净的。

所以我想在创建和推送一个新的视图控制器时,它实际上并不是一个新的,而是旧的。

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

提前致谢

4

2 回答 2

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类。

于 2013-08-19T08:28:50.570 回答
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];
于 2013-08-19T08:23:55.507 回答