Ios 重新加载UIViewController并解除锁定
我有一个基于回合的游戏,允许用户同时玩多场比赛。轮换后,用户可以单击“转到下一场比赛”按钮 单击按钮时,我只需创建一个新的GameViewController并按下它。但是,在执行此操作时,旧的GameViewController不会解除锁定,有时会与新的viewController发生冲突(就像在旧的viewController上执行增加分数的块,会增加新的viewController上的分数) 我之所以要推送一个新的viewController而不是nuke并清理旧的viewController并重用它,是因为我想要推送动画,出于安全原因,我想要一个干净的 因此,我猜在创建和推送新的viewcontroller时,它实际上不是新的,而是旧的Ios 重新加载UIViewController并解除锁定,ios,objective-c,Ios,Objective C,我有一个基于回合的游戏,允许用户同时玩多场比赛。轮换后,用户可以单击“转到下一场比赛”按钮 单击按钮时,我只需创建一个新的GameViewController并按下它。但是,在执行此操作时,旧的GameViewController不会解除锁定,有时会与新的viewController发生冲突(就像在旧的viewController上执行增加分数的块,会增加新的viewController上的分数) 我之所以要推送一个新的viewController而不是nuke并清理旧的viewControll
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle: nil];
GameViewController *gameViewController = (GameViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"GameViewController"];
gameViewController.matchObject = match;
[weakSelf.navigationController pushViewController:gameViewController animated:YES];
提前感谢如果您只需推送一个新的视图控制器,您的旧视图控制器将仍然存在。它只是不可见,因为新的在上面。您可以尝试以下操作(假设您尚未在其他地方删除旧的视图控制器):
您正在推送
GameViewController
的新实例,但您的旧控制器不会被销毁,因为它存储在导航控制器堆栈中。有一个潜在的内存泄漏-如果你每转一圈就推一个新的控制器,并且从不弹出它
在新控制器动画完成后,可以通过更改属性直接更新导航堆栈。
(例如
// I assume you using ARC.
NSMutableArray *temp = [NSMutableArray array];
[temp addObjectsFromArray:self.navigationController.viewControllers]
[temp removeObjectAtIndex:temp.count - 2];
self.navigationController.viewControllers = [temp copy];
但是这个解决方案对我来说并不好)
您可以在不使用导航控制器的情况下使用漂亮的推送转换,请查看类。您是否尝试过在dealloc方法中使用NSLog来查看它是否被调用?我相信在这一行
[weakSelf.navigationController popViewControllerAnimated:NO]之后,当前的视图控制器将被销毁
,最好使用strong
变量。这不是OP想要的吗?他想调用dealloc,所以我猜他想销毁它代码>行[weakSelf.navigationController pushViewController:gameViewController动画:是]
没有意义,因为weakSelf
将为零,他将无法访问navigationController
为什么在此之后weakSelf应为零?好吧,我100%不知道,但看起来此代码是在块内执行的,weakSelf
具有\uu-weak
修改器以避免强引用循环。当前控制器从导航堆栈中弹出后,将不会有对它的引用,它将被销毁,所有的\u弱
引用将被清空。谢谢!成功了。但是需要为删除设置延迟,并让新的加载。
// I assume you using ARC.
NSMutableArray *temp = [NSMutableArray array];
[temp addObjectsFromArray:self.navigationController.viewControllers]
[temp removeObjectAtIndex:temp.count - 2];
self.navigationController.viewControllers = [temp copy];