Удаление viewcontrollers из стека навигации


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

8 66

8 ответов:

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

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

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

Edit: Swift Code

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!

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

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

NSArray* tempVCA = [self.navigationController viewControllers];

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

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

Swift 3 & 4

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

Swift 2.0:

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

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

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

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

использовать

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

Он будет заботиться о ViewControllers navigationController. viewControllers, а также navigationItems сложены в navigationBar.

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

используя

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

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

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

self.navigationController!.viewControllers.count - 1