У меня есть проблема, чтобы удалить ViewController из стека навигации? - PullRequest
2 голосов
/ 24 сентября 2019

У меня 5 ВК, я успешно удаляю ViewController из стека навигации.Но проблема в том, что при нажатии кнопки «Назад» в навигации он перемещается в предыдущий VC и показывает удаленный VC на панели навигации.

Пример: у меня есть 5 VC: VC1, VC2, VC3, VC4, VC5.

Теперь я перемещаюсь из VC1 -> VC2, ..... VC4 -> VC5.И у меня есть пользовательская панель навигации заголовок кнопки назад.Здесь я удаляю VC4 из стека.

При нажатии кнопки «Назад» в VC5 происходит прямое перемещение в VC3.Но панель навигации - это VC4.При повторном щелчке по панели навигации теперь отображается панель навигации VC3 в том же VC.

КАК РЕШИТЬ эту проблему.Я хочу отображать VC3 и VC3 панель навигации в один клик.

Код для удаления VC из стека навигации:

guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers // To get all UIViewController stack as Array
navigationArray.remove(at: navigationArray.count - 2) // To remove previous UIViewController
self.navigationController?.viewControllers = navigationArray

Ответы [ 4 ]

2 голосов
/ 24 сентября 2019

Скрыть кнопку «Назад» по умолчанию и добавить пользовательскую кнопку «Назад» с действием:

override func viewDidLoad {
    super.viewDidLoad()
    self.navigationItem.hidesBackButton = true
        let customBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItem.Style.plain, target: self, action: #selector(back))
        self.navigationItem.leftBarButtonItem = customBackButton
}

Используйте popToViewController для возврата к определенному контроллеру просмотра:

@objc func back(sender: UIBarButtonItem) {
    guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers // To get all 
self.navigationController!.popToViewController(navigationArray[navigationArray.count - 2], animated: true)
}
2 голосов
/ 24 сентября 2019

Используйте следующее:

navigationController?.setViewControllers(navigationArray!, animated: true)

Например:

guard let navigationController = self.navigationController else { return } 
var navigationArray = navigationController.viewControllers 
navigationArray.remove(at: navigationArray.count - 2) 
navigationController.setViewControllers(navigationArray!, animated: true)

Из документов :

Используйте этот метод для обновленияили замените текущий стек контроллера представления без явного нажатия или выталкивания каждого контроллера.Кроме того, этот метод позволяет обновлять набор контроллеров без анимации изменений, что может быть целесообразно во время запуска, когда требуется вернуть контроллер навигации в предыдущее состояние.

Если анимации включены, этот методрешает, какой тип перехода выполнять, основываясь на том, находится ли последний элемент в массиве элементов в стеке навигации.Если контроллер представления в настоящее время находится в стеке, но не является самым верхним элементом, этот метод использует всплывающий переход;если это самый верхний элемент, переход не выполняется.Если контроллер представления не находится в стеке, этот метод использует push-переход.Выполняется только один переход, но когда этот переход завершается, все содержимое стека заменяется новыми контроллерами представления.Например, если контроллеры A, B и C находятся в стеке, и вы устанавливаете контроллеры D, A и B, этот метод использует pop-переход, и результирующий стек содержит контроллеры D, A и B.


Редактировать 1

Когда вы нажимаете VC5, используйте следующий код

let vc = YourVC5()
var array = navigationController?.viewControllers
array?.removeLast()
array?.append(vc)
navigationController?.setViewControllers(array!, animated: true)

Идея состоит в том, когда вы помещаете VC5 в стекперед нажатием мы исключаем VC4 из списка, таким образом, по умолчанию VC3 будет ниже VC5, и вам просто нужно вызвать navigationController? .popViewController (animated: true), и он должен появиться непосредственно в VC3

0 голосов
/ 24 сентября 2019

если вы используете пользовательский NavigationBar, тогда вам нужно использовать пользовательскую кнопку возврата, нажмите Действие в VC5: -

@IBAction func btnBackAction(_ sender: UIButton) {
       let vc = VC3()
       self.navigationController.popToViewController(vc, animated: true)
 }

И если вы можете использовать По умолчанию NavigationBar, чем нужно удалить VC4 в стеке навигации в VC5 примерно так: -

guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers // To get all UIViewController stack as Array
navigationArray.remove(at: navigationArray.count - 2) // To remove previous UIViewController
self.navigationController?.viewControllers = navigationArray
0 голосов
/ 24 сентября 2019

Вы можете использовать popToViewController (_: animated:) (как ответил Пракаш Шайва выше):

guard let navigationController = self.navigationController else { return }

var navigationArray = navigationController.viewControllers // To get all 
self.navigationController.popToViewController(navigationArray[navigationArray.count - 2], animated: true)

И попытаться обновить панель навигации в методе viewWillAppear (_:) для VC3.

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