UINavigationController popToRootViewController,然后立即推送一个新视图

Ben*_*Ben 23 iphone uinavigationcontroller

我有一个带有两个选项卡的tabBarController,其中第一个包含NavigatorController的实例.navigatorController是使用自定义viewController"peersViewController"启动的,它列出了tableView上的所有网络对等体.选择对等体后,"FilesListViewController"(将c:\目录中的列表文件)的实例推送到navigationController堆栈中.

在这个filesListViewController中我有一个按钮让它导航到说文档目录.为此,我连接了接口以在rootViewController中调用gotoDirectory:(NSString*)路径方法:

- (void)gotoDirectory:(NSString*)path {
     [[self navigationController] popToRootViewControllerAnimated:YES];
     NSArray *files = [self getFilesFromPeerAtPath:path];
     FilesListViewController *filesVC = [[FilesListViewController alloc] initWithFiles:files];
     [[self navigationController] pushViewController:filesVC animated:YES];
     [filesVC release];
}
Run Code Online (Sandbox Code Playgroud)

但是,当我按下该按钮时,navigationController确实将我的视图弹出到根视图控制器,但是我实例化的FilesListViewController没有出现.从日志中,我知道确实调用了自定义initWithFiles方法,并且确实发生了网络内容以获取文件名.

关于此,还有其他一些问题.我尝试点击第二个标签,然后点击返回第一个标签,然后点击!我需要的文件名就在那里.看起来数据和filesListViewController确实被推入了navigatorController堆栈,但显示没有刷新,而是停留在rootViewController(peersViewController)的屏幕上.

我做错了吗?

--Ben.

- 在发布问题后15分钟编辑.我找到了一个解决方法,但是让我困扰的是pop然后推不起作用.

- (void)gotoDirectory:(NSString*)path {
     PeersListViewController *rootViewController = (PeersListViewController*)[[[self navigationController] viewControllers] objectAtIndex:0];
     [[self navigationController] setViewControllers:[NSArray arrayWithObject:rootViewController]];
     FilesListViewController *filesVC = [[FilesListViewController alloc] initWithFiles:files];
     [[self navigationController] pushViewController:filesVC animated:YES];
     [filesVC release];
}
Run Code Online (Sandbox Code Playgroud)

似乎应该以这种方式规避navigationController,我可能不得不释放原始堆栈中的所有viewControllers.但这确实适用于iphone 3.0模拟器.

如果我正在使用此代码,应如何处理内存释放?我应该获得原始的NSArray视图控制器并释放所有内容吗?

Nic*_*eet 83

这个问题和解决方案实际上非常简单.

呼叫[self.navigationController popToRootViewControllerAnimated:YES]设置self.navigationControllernil.当你随后打电话给[self.navigationController pushViewController:someOtherViewController]你时,你实际上正在发送一条消息nil,它什么都不做.

要解决此问题,只需设置对navigationController的本地引用,然后使用它:

UINavigationController * navigationController = self.navigationController;
[navigationController popToRootViewControllerAnimated:NO];
[navigationController pushViewController:someOtherViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

正如Jason所说,popToRootViewController必须在没有动画的情况下执行才能正常工作.

感谢Apple论坛上的jpimbert指出这一点.

  • 嗯,有了这个我得到:不平衡的调用开始/结束外观转换为<TheViewController:0x1504b0>在推送调用后编辑:啊,那是因为我正在设置弹出调用的动画 (2认同)

Lod*_*oda 10

我遇到了一个非常类似的问题(但没有使用tab).

我有三个viewController : main(root),形式和结果.当UINavigationController堆栈是

"main -> result"
Run Code Online (Sandbox Code Playgroud)

在一个btnClick我做了一个popToRootViewControllerAnimated然后推送formViewCtrl.为了有

"main -> form"
Run Code Online (Sandbox Code Playgroud)

导航栏标题和后退按钮标签是正确的,并调用formViewCtrl的事件.但是,我仍然看到主要观点.

这是我的"解决方案"

做了一些测试后,我发现没有动画去rootViwCtrl这个工作正常.所以我只使用动画来推动viewCtrl.

iPhone 3.0,在设备和模拟器上发现问题.

如果我有新的东西,我会更新/评论我的帖子.

  • 是的,你需要弹出没有动画(以便它立即发生),然后推动动画.如果您尝试一起进行两次动画更改(需要时间才能完成),视图将处于错误状态. (2认同)