我希望重新启动视图控制器。
我所做的是将当前视图控制器从导航堆栈中弹出,并将视图控制器的新实例推送到堆栈上。 但是,这不起作用。当前视图控制器从导航堆栈中弹出,但新实例未被压入堆栈。
这是我的代码段:
[[self navigationController] popViewControllerAnimated:YES];
VideoPlayerViewController *videoPlayer = [[VideoPlayerViewController alloc] init];
[videoPlayer setMedia:media];
[[self navigationController] pushViewController:videoPlayer animated:YES];
[videoPlayer release];
videoPlayer = nil;
NSLog(@"Restarting view controller...");
知道可能出现什么问题吗?
答案 0 :(得分:3)
根据您的代码,看起来您正在尝试弹出当前视图控制器,然后立即重新推送它,并在两个方向上都有动画。我无法想象你为什么要这样做,但暂时把它放在一边,这就是你如何让它发挥作用。
首先,将<UINavigationControllerDelegate>
添加到@interface声明中。然后:
- (void)repushViewController {
self.navigationController.delegate = self;
[[self navigationController] popViewControllerAnimated:YES];
}
- (void)navigationController:(UINavigationController *)navController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
navController.delegate = nil;
VideoPlayerViewController *videoPlayer = [[VideoPlayerViewController alloc] init];
[videoPlayer setMedia:media];
[navController pushViewController:videoPlayer animated:YES];
[videoPlayer release];
}
答案 1 :(得分:0)
我想你需要在通话之间给出一些时间间隔。由于你是用动画做的,所以需要一些时间才能完成第一次调用。
首先尝试[[self navigationController] popViewControllerAnimated:NO];
。
答案 2 :(得分:0)
如果您询问VideoPlayerViewController
,
[[self navigationController] popViewControllerAnimated:YES];
转到上一个视图控制器。因此,可能无法执行当前视图控制器中的代码。 VideoPlayerViewController
的新实例应该在前一个视图控制器中实例化。
答案 3 :(得分:0)
是或者是,视图控制器被“弹出”在堆栈的顶部?如果是这样,我可能会建议更改设计 - 我会使用UINavigationController
的这种方法:
- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated
交换你的视图控制器,如果仍然需要,可以用动画交换。
VideoPlayerViewController *videoPlayer = [[VideoPlayerViewController alloc] init];
[videoPlayer setMedia:media];
[[self navigationController] setViewControllers:[NSArray arrayWithObject:videoPlayer]
animation:YES];
[videoPlayer release];