2012-04-23 4 views

ответ

114

Используйте этот код и наслаждайтесь:

NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers]; 

// [navigationArray removeAllObjects]; // This is just for remove all view controller from navigation stack. 
[navigationArray removeObjectAtIndex: 2]; // You can pass your index here 
self.navigationController.viewControllers = navigationArray; 
[navigationArray release]; 

Надеется, что это поможет.

+0

я привязал это и не работает. мне сказали, что что-то связанное со свойствами вызывает его не отмену viewcontrollers. –

+1

это работало в iOS <7, но приводит к странному поведению в iOS 7. –

+0

Я скоро добавлю код для ios7 ... Позвольте мне проверить с iOS 7 – Nit

44

Вы можете сначала получить все контроллеры представления в массиве, а затем после проверки с помощью соответствующего класса контроллера класса вы можете удалить тот, который вы хотите.

Вот небольшой фрагмент кода:

NSArray* tempVCA = [self.navigationController viewControllers]; 

for(UIViewController *tempVC in tempVCA) 
{ 
    if([tempVC isKindOfClass:[urViewControllerClass class]]) 
    { 
     [tempVC removeFromParentViewController]; 
    } 
} 

Я думаю, что это сделает вашу работу легче.

+0

Это может использоваться для многоцелевого использования. Спасибо :) – Hemang

+6

Когда я использую это, контроллер удаляется должным образом. Но когда я использую кнопку «Назад», моя панель навигации отображает информацию о удаленном viewController. Кто-нибудь еще получает это странное поведение и как я могу его исправить? –

+0

Удаление диспетчера представлений из родительского контроля? Мне показалось, что это было изворотливым, поэтому я тестировал на iOS 9, и он просто удаляет представление о tempVC от себя и возвращает его в состояние по умолчанию, как в раскадровке. Вот об этом – NSNoob

4

Если вы пытаетесь перейти на контроллер 2-го вида с 5-го контроллера (пропуска 3-го и 4-го), вы хотели бы использовать [self.navigationController popToviewController:secondViewController].

Вы можете получить secondViewController из стека контроллера навигации.

secondViewController = [self.navigationController.viewControllers objectAtIndex:yourViewControllerIndex]; 
+1

Не хотите всплывать в текущем диспетчере представлений. Текущий контроллер просмотра должен оставаться неповрежденным, но мне нужно выставить 2 наблюдаемых контроллера под ним в стеке –

+0

@JeanPaulScott. Интересно, зачем вы хотите это сделать, если не для всплытия – Vignesh

+0

Существует случай, когда у меня бывают разные экземпляры одного и того же элемента управления представлением в стек. Поэтому, когда новый экземпляр создается и помещается в стек, я хочу вывести предыдущий экземпляр и связанный с ним viewcontroller –

20

Свифта 3:

self.navigationController!.viewControllers.removeAll()

self.navigationController?.viewControllers.remove(at: "insert here a number")

Swift 2.1:

удалить все:

self.navigationController!.viewControllers.removeAll()

удалить с индексом

self.navigationController?.viewControllers.removeAtIndex("insert here a number")

Там куча более возможных действий, как removeFirst, диапазон и т.д.

+2

Глядя на ваш ответ, у меня появилась идея для моего проекта t. Большое спасибо. –

8

Swift 2,0:

var navArray:Array = (self.navigationController?.viewControllers)! 
    navArray.removeAtIndex(navArray.count-2) 
    self.navigationController?.viewControllers = navArray 
+2

Итак, вы не пытаетесь развернуть контроллер навигации, вы можете сделать его if-выражением 'if var navArray = ... {...}' – Kiley

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