2

我希望重新启动视图控制器。

我所做的是将当前视图控制器从导航堆栈中弹出,并将视图控制器的新实例推送到堆栈上。但是,这不起作用。当前视图控制器从导航堆栈中弹出,但新实例并未推入堆栈。

这是我的代码片段:

[[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...");

知道有什么问题吗?

4

4 回答 4

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];
}
于 2011-07-15T10:13:01.990 回答
0

我想你需要在通话之间给出一些时间间隔。由于您正在使用动画执行此操作,因此需要一些时间来完成第一次调用本身。

所以先试试,[[self navigationController] popViewControllerAnimated:NO];

于 2011-07-15T09:48:14.873 回答
0

如果你问的是VideoPlayerViewController

[[self navigationController] popViewControllerAnimated:YES];

转到上一个视图控制器。所以当前视图控制器中的代码可能不会被执行。的新实例VideoPlayerViewController应该在前一个视图控制器中实例化。

于 2011-07-15T09:49:58.713 回答
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];
于 2011-07-15T09:55:11.180 回答