我有一个带有两个选项卡的 tabBarController,其中第一个包含 NavigatorController 的实例。navigatorController 使用自定义视图控制器“peersViewController”启动,该视图控制器列出了 tableView 上的所有网络对等点。选择一个对等点后,“FilesListViewController”的一个实例(列出 c:\ 目录中的文件)被推送到 navigationController 堆栈中。
在这个 filesListViewController 中,我有一个按钮可以让它导航到文档目录。为此,我将接口连接到在 rootViewController 中调用 gotoDirectory:(NSString*)path 方法:
- (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];
}
但是,当我按下该按钮时,navigationController 确实将我的视图弹出到根视图控制器,但是我实例化的 FilesListViewController 没有出现。从日志中,我知道确实调用了自定义 initWithFiles 方法,并且确实发生了网络东西来获取文件名。
对此还有其他一些奇怪的地方。我尝试单击第二个选项卡,然后单击返回第一个选项卡,然后哇啦!我需要的文件名在那里。看起来数据和 filesListViewController 确实被推入了 navigatorController 堆栈,但显示没有刷新而是卡在 rootViewController (peersViewController) 的屏幕上。
我做错什么了吗?
——本。
-- 在发布问题 15 分钟后编辑。我找到了一种解决方法,但让我感到困扰的是 pop 然后 push 不起作用。
- (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];
}
似乎不应该以这种方式规避导航控制器,我可能不得不释放原始堆栈中的所有视图控制器。然而,这确实适用于 iphone 3.0 模拟器。
如果我使用这段代码,应该如何处理内存释放?我应该得到视图控制器的原始 NSArray 并释放所有内容吗?