it-swarm.com.ru

Удаление контроллеров представления из стека навигации

У меня есть стек навигации, скажем, 5 UIViewControllers. Я хочу удалить 3-й и 4-й контроллеры вида в стеке одним нажатием кнопки в 5-м контроллере вида. Можно ли сделать это? Если так, то как?

75
Jean Paul Scott

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

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

Надеюсь, что это поможет вам.

Правка: Swift Код

var navigationArray = self.navigationController?.viewControllers //To get all UIViewController stack as Array
navigationArray!.remove(at: (navigationArray?.count)! - 2) // To remove previous UIViewController
self.navigationController?.viewControllers = navigationArray!
140
Nit

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

Вот небольшой кусочек кода:

NSArray* tempVCA = [self.navigationController viewControllers];

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

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

46
Sourabh Bhadwaj

Swift 3 и 4/5

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, range и т.д.

31
kuzdu

Swift 2.0:

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

Лучше всего использовать функцию setViewControllers из UINavigationController. Также есть параметр animated для включения анимации.

func setViewControllers(_ viewControllers: [UIViewController], animated: Bool)

Пример в Swift для вопроса

func goToFifthVC() {

    var currentVCStack = self.navigationController?.viewControllers
    currentVCStack?.removeSubrange(2...3)

    let fifthVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "fifthVC")
    currentVCStack?.append(fifthVC)

    self.navigationController?.setViewControllers(currentVCStack!, animated: true)
}

Я пробовал другие способы, такие как [tempVC removeFromParentViewController];. Это делает странное поведение, удаленная навигация ViewController, все еще показывающая когда всплывающее окно, как сообщает @ robin-ellerkmann

5
Megamind

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

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

secondViewController =  [self.navigationController.viewControllers objectAtIndex:yourViewControllerIndex];
4
Vignesh

Свифт 5:

        navigationController?.viewControllers.removeAll(where: { (vc) -> Bool in
            if vc.isKind(of: MyViewController.self) || vc.isKind(of: MyViewController2.self) {
                return false
            }
            else {
                return true
            }
        })
3
Niklas

Использовать этот

if let navVCsCount = navigationController?.viewControllers.count {
    navigationController?.viewControllers.removeSubrange(Range(2..<navVCsCount - 1))
}

Это позаботится о ViewControllers из navigationController. viewControllers, а также элементы навигации, расположенные в навигационной панели.

Примечание: Обязательно вызывайте его хотя бы после viewDidAppear

3
Nikola Markovic

Это решение работало для меня в Swift 4:

let VCCount = self.navigationController!.viewControllers.count
self.navigationController?.viewControllers.removeSubrange(Range(VCCount-3..<VCCount - 1))

ваш текущий индекс контроллера представления в стеке:

self.navigationController!.viewControllers.count - 1
0
babak