【问题标题】:How to release a UINavigationController?如何释放 UINavigationController?
【发布时间】:2011-05-03 15:28:54
【问题描述】:

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

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

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


感谢瑞恩的回答。我的做法是这样的

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]?
    }
}

【问题讨论】:

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


    【解决方案1】:

    不赞同你想做的事,但这是怎么做的:

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

    干杯!

    【讨论】:

    • 将它们弹回,但我不确定它是否会释放内存?
    • 应该是[navController removeFromSuperView];
    【解决方案2】:

    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];
        }
    }
    

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

    【讨论】:

    • 太好了,谢谢,.. 我已根据您的见解修改了我的问题以显示我使用的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多