如何发布UINavigationController?

时间:2010-11-01 20:57:07

标签: iphone objective-c memory-management ios uinavigationcontroller

我的应用设置是一个带有三个标签的UITabBar。在每个选项卡中都有一个不同的UINavigationController。

在第一个选项卡中有一个刷新按钮 - 这将加载来自Web(xml)的大量数据。数据显示在三个标签栏中。

每当有人刷新数据时,如何释放UINavigationControllers?我想要的原因是当数据发生变化时,各个标签可能会显示全新的数据,因此保留该屏幕会有点危险..如果这有意义的话。因此,我想完全刷新UINavigationControllers,并在再次单击选项卡时显示导航堆栈中的第一个视图。


感谢Ryan的回答。我这样做的方式是这样的

for(UINavigationController *navController in [self.navigationController.tabBarController viewControllers]) {
    NSLog(@"popping %@", [navController title]);
    [navController popToRootViewControllerAnimated:NO];
    if ([[navController title] isEqualToString:@"Tab2"])
    {
        Tab2RootController *newRoot2 = [[Tab2RootController alloc] initWithNibName:@"Tab2RootController" bundle:nil];
        newRoot2.title = @"Tab2";
        [navController setViewControllers:[NSArray arrayWithObject:newRoot2] animated:NO];
        //need [newRoot2 release]?
    }
    if ([[navController title] isEqualToString:@"Tab3"])
    {
        Tab3RootController *newRoot = [[Tab3RootController alloc] initWithNibName:@"Tab3RootController" bundle:nil];
        newRoot3.title = @"Tab3";
        [navController setViewControllers:[NSArray arrayWithObject:newRoot3] animated:NO];
        //need [newRoot3 release]?
    }
}

2 个答案:

答案 0 :(得分:3)

不支持您想要做的事情,但这是如何做到的:

-(void)showRootNavigationControllers {
    for(UINavigationController *navController in [tabBarController viewControllers]) {
        [navController popToRootViewControllerAnimated:NO];
    }
}

干杯!

答案 1 :(得分:1)

除了根视图控制器之外,popToRootViewController将弹出堆栈上的所有视图控制器。如果你想摆脱根视图控制器,你需要使用 - [UINavigationController setViewControllers:animated:]完全替换它。当然,您需要设置新的根视图控制器。它看起来像这样(修改MattLeff的答案,上面):

-(void)showRootNavigationControllers {
    for(UINavigationController *navController in [tabBarController viewControllers]) {
        // You do this: set up the new root view controller for the given tab and assign it to a variable, e.g. newRootControllerForTab...

        // Now set that new root controller as the only view controller in the nav controller.
        [navController setViewControllers:[NSArray arrayWithObject:newRootControllerForTab] animated:NO];
    }
}

请注意,这将立即切换视图控制器,没有动画。通过为每个导航栏设置整个视图控制器列表,它们将释放旧的视图控制器,只要没有其他人保留它们,它们就会被释放。