0

Моя настройка приложения - UITabBar с тремя вкладками. На каждой вкладке находится другой UINavigationController.Как выпустить 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]? 
    } 
} 

ответ

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

3

Не одобряя то, что вы хотели сделать, но это, как это сделать:

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

Ура!

+0

, который выталкивает их назад, но я не уверен, что он освобождает память? – cannyboy

+1

Должно быть '[navController removeFromSuperView];' – runmad

Смежные вопросы