У меня есть родительский UIViewController(MainVC
). Оттуда у меня есть 2 перехода к 2 UIViewControllers: FirstVC
(идентификатор: goFirstVC
) и SecondVC
(идентификатор: goSecondVC
)
В FirstVC
у меня есть кнопка Save
, и когда я нажимаю на нее, я хочу закрыть FirstVC
и продолжить SecondVC
.
Вот мой код:
@IBAction func saveBtnTapped(_ sender: UIButton) {
//navigationController?.popViewController(animated: true)
let destinationController = self.storyboard?.instantiateViewController(withIdentifier: "goSecondVC") as! SecondVC
let presentingVC = self.presentingViewController
self.dismiss(animated: false, completion: { () -> Void in
presentingVC!.present(destinationController, animated: true, completion: nil)
})
}
Вот дизайн для моей проблемы:
Вы можете использовать setViewControllers
, чтобы сохранить только родителя и второй VC.
let destinationController = self.storyboard?.instantiateViewController(withIdentifier: "goSecondVC") as! SecondVC
self.navigationController?.setViewControllers([self.navigationController!.viewControllers.first!,destinationController], animated: true)
Ошибка заключается в следующем: libc++abi.dylib: завершение с необработанным исключением типа NSException. А goSecondVC
— это имя перехода.
это должен быть идентификатор раскадровки
Я только что дал раскадровке то же имя, и в консоли также происходит сбой с той же ошибкой.
Работает идеально. Был конфликт имен, потому что я использовал одно и то же имя для Segue и StoryboardID. Спасибо, Ш_Хан.
попытайся:
Мы можем управлять представленными контроллерами с помощью навигационного контроллера, вызывающего методы pushViewController
и popViewController
.
FirstVC.navigationController?.popViewController(animated: animated) // pops the top view controller
self.navigationController?.pushViewController(SecondVC, animated: true) // Pushes a view controller onto navigation's stack of controllers
В твоем случае:
let destinationController = self.storyboard?.instantiateViewController(withIdentifier: "goSecondVC") as? SecondVC
self.navigationController?.popViewController(animated: animated)
self.navigationController?.pushViewController(destinationController, animated: true)
Существует много методов, но один из общих — использование делегатов и протоколов. Используйте следующий код в своих классах.
Добавьте следующий код в первый VC
protocol SecondVCDelegate : AnyObject {
func goToSecondVC()
}
class FirstVC: UIViewController {
var Delegate : SecondVCDelegate!
@objc func save() {
Delegate.goToSecondVC()
}
}
//In second view
Добавьте следующий код в MinVC
class MainVC: UIViewController {
override func viewDidAppear() {
self.performSegue(withIdentifier: <yourSegueIdentifierToFirstVC>, sender: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == <yourSegueIdentifierToFirstVC> {
let cont = segue.destination as! FirstVC
cont.Delegate = self
}
}
}
extension MainVC : SecondVCDelegate {
func goToSecondVC() {
self.performSegue(withIdentifier: <yourSegueIdentifierToSecondVC>, sender: nil)
}
}
//This is MainVC
goSecondVC
является идентификатором раскадровки второго имени vc или segue?