2012-06-06 4 views
3

У меня есть приложение iphone, которое использует навигационный контроллер. В этом контроллере я выдвигаю некоторые виды. В некоторых случаях я хочу «очистить» стек представлений, оставив только rootViewController контроллера навигации в стеке и нажав другой viewController, который у меня есть.iphone NavigationController clear views stack

Может ли кто-нибудь дать мне пример о том, как это сделать? Я не вижу никакого метода, который очищает стек.


Ответ 1: Я попытался положить в кнопку действий следующий код:

[self.navigationController popToRootViewControllerAnimated:NO]; 

do some stuff here to prepare for the push. 

[self.navigationController pushViewController:self.myOtherController animated:YES]; 

, но она появляется только в roorController. Он не подталкивает другой viewController, который я хочу.

+0

Я обновил свой ответ. Смотри ниже. –

+0

А теперь я понимаю. У меня есть решение, и я смогу обновить свой ответ в течение ближайших нескольких часов, когда у меня будет время. –

+0

Я обновил свой ответ с помощью проверенного кода.См. Ниже. –

ответ

3

Следующий код позволит пользователю развернуть иерархию вида, и при нажатии на кнопку, поп-обратно в контроллер просмотра корневой и нажмите новый вид ,

DetailViewController.m ~ контроллер вид, из которого очистить стек навигации:

- (IBAction)buttonPressed:(id)sender { 
    [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"popBack" object:nil]]; 
} 

Приведенный выше код делает вызов NSNotificationCenter, разместив уведомление о том, что RootViewController может реагировать, когда услышал. Но сначала RootViewController должен зарегистрироваться для получения уведомления.

RootViewController.m

- (void)viewDidLoad 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pushViews) name:@"popBack" object:nil]; 
    [super viewDidLoad]; 
} 

Далее RootViewController необходимо настроить ссылочный селектор -pushViews.

- (void)pushViews { 
    //Pop back to the root view controller 
    [self.navigationController popToRootViewControllerAnimated:NO]; 

    //Allocate and init the new view controller to push to 
    NewViewController *newVC = [[NewViewController alloc] init]; 

    //Push the new view controller 
    [self.navigationController pushViewController:newVC animated:YES]; 
} 

Убедитесь, что при вызове -popToRootViewControllerAnimated:, необходимо указать NO для анимации. Включение анимации вызывает икоту в анимации навигационной панели и смущает систему. Вышеприведенный код при вызове очистит стек навигации, оставив только RootViewController, а затем добавит NewViewController.

Причина, по которой ваш первоначальный код не был полностью выполнен, состоял в том, что после вызова -popToRootViewController: из вашего элемента управления DetailViewController методы RootViewController заняли основной поток, а DetailViewController был выпущен. Таким образом, никакой дополнительный код не запускался из этого контроллера представления. Используя вышеприведенный код, стек навигации возвращается к тому же контроллеру представления, который загружается.

+0

, пожалуйста, проверьте выше, чтобы увидеть мой ответ. – Panos

+0

Конечно, я выделил и инициировал второй контроллер вида. Когда он появляется в rootVC, кажется, что он игнорирует остальную часть кода в этом методе. – Panos

+1

Вы awasome. Althougt Мне нужно было внести некоторые изменения, чтобы передать параметр, который мне нужен больше, он работал, как я и хотел. Большое спасибо, мой друг! – Panos

1

Я думаю, что вы ищете -popToRootViewControllerAnimated:

+0

, пожалуйста, проверьте выше, чтобы увидеть мой ответ. – Panos

0
UIViewController* root = [self.navigationController.viewControllers objectAtIndex:0]; 

self.navigationController.viewControllers = [NSArray arrayWithObjects:root, cal, nil]; 

Где находится контроллер контроля «cal». Но анимации нет.

0

В дополнение к Кракен ответ,

Добавить ниже функции в UIViewController, который вы собираетесь поп-музыки.

(void)viewDidDisappear:(BOOL)animated { 

    [super viewDidDisappear:YES]; 

    for(UIView *view in self.view.subviews) 
    { 
     [view removeFromSuperview]; 
    } 
} 
Смежные вопросы