0

我的應用程序設置是一個帶有三個選項卡的UITabBar。在每個選項卡中是不同的UINavigationController。如何釋放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]? 
    } 
} 

回答

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

注意,這將瞬間切換視圖控制器,沒有動畫。通過設置每個導航欄的整個視圖控制器列表,他們將釋放舊的視圖控制器,只要沒有其他人保留它們,它們就會被釋放。

+0

太好了,謝謝。我修改了我的問題,根據您的洞察力顯示了我使用的代碼。 – cannyboy 2010-11-06 12:41:36

3

不認可你想要做什麼,但是這是如何做到這一點:

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

乾杯!

+0

彈出回來,但我不確定它釋放內存? – cannyboy 2010-11-02 16:02:06

+1

應該是'[navController removeFromSuperView];' – runmad 2010-11-03 03:23:06