Как добавить пользовательские действия в UIBarButtonItem

У меня есть viewController (HomeViewController()), который встроен в NavigationCotroller, и у меня есть горизонтальный CollectionView с 6 ячейками в нижней части моего viewController, и я реализовал метод делегата didSelectItemAt indexPath: IndexPath

Теперь, когда я выберу любую из ячеек, она перейдет к соответствующему viewController (self.navigationController?.pushViewController(ViewControllerInstance, animated: true)) давайте назовем его "NewVC1()", так как я использую pushViewController, он создаст для меня кнопку "Назад", и если я нажму на кнопку "Назад", он вернется к предыдущему viewController. Это общий сценарий и работает как ожидалось.

В моем случае после выбора collectionViewCell в "HomeViewController ()" я перейду к "NewVC1()", и там у меня будет тот же CollectionView, что и в предыдущем viewController (HomeViewController()), и теперь, если я выберу любой из Ячейки в текущем viewController (NewVC1 ()) снова я перейду к соответствующему viewController (NewVC2 ()) так же, как до использования pushViewController, и теперь, если я нажимаю кнопку "Назад" в "NewVC2 ()", я не Я хочу перейти к "NewVC1()" и вместо этого я хочу перейти к "HomeViewController()".. Как я могу достичь этого, есть ли возможность сделать это?

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

РЕДАКТИРОВАТЬ:

Символично:

let VC1 = HomeViewController() let VC2 = NewViewController1() let VC3 = NewViewController2()

Навигация: VC1 -> VC2 -> VC3 и, если хотите вернуться к VC1,

общий случай:

VC3 -> VC2 и VC2 -> VC1 (возможно)

мое дело:

VC3 -> VC1 (?)

2 ответа

Решение

Вместо того, чтобы толкать от VC2 в VC3 используйте setViewControllers. Затем, когда вы нажимаете кнопку назад из VC3 это вернется к VC1

Используйте этот код в VC2collectionView didSelectItemAt

let vc3 = self.storyboard?.instantiateViewController(withIdentifier: "VC3") as? VC3
if var viewControllers = self.navigationController?.viewControllers {
    viewControllers.removeLast()
    viewControllers.append(vc3)
    self.navigationController?.setViewControllers(viewControllers, animated: true)
}

Вы можете достичь этого двумя способами:

Первый способ - создайте свою собственную кнопку возврата:

let backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.plain, target: self, action: #selector(YourViewController.back(sender:)))
self.navigationItem.leftBarButtonItem = backButton  

func back(sender: UIBarButtonItem) {
    self.navigationController?.popToRootViewController(animated: true)
}  

Второй способ - использовать isMovingFromParentViewController:

override func viewWillDisappear(animated : Bool) {
super.viewWillDisappear(animated)

if self.isMovingFromParentViewController {
    self.navigationController?.popToRootViewController(animated: true)
}

}
Другие вопросы по тегам