Мне нужно отправить некоторые данные обратно из SecondView в First View по popView. Как я могу отправить данные по popViewControllerAnimated?
Спасибо!
Мне нужно отправить некоторые данные обратно из SecondView в First View по popView. Как я могу отправить данные по popViewControllerAnimated?
Спасибо!
Вы можете передать данные обратно, используя delegate
protocol
в ChildViewController
delegate
в ChildViewController
ChildViewController
протокол в MainViewController
ChildViewController
из MainViewController
при navigate
delegate
в MainViewController
delegate
из ChildViewController
пример
В ChildViewController: напишите код ниже...
protocol ChildViewControllerDelegate
{
func childViewControllerResponse(parameter)
}
class ChildViewController:UIViewController
{
var delegate: ChildViewControllerDelegate?
....
}
В MainViewController
// extend 'delegate'
class MainViewController:UIViewController,ChildViewControllerDelegate
{
// Define Delegate Method
func childViewControllerResponse(parameter)
{
.... // self.parameter = parameter
}
}
Есть два варианта:
А) с Сегей
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
let goNext = segue.destinationViewController as ChildViewController
goNext.delegate = self
}
Б) без сега
let goNext = storyboard?.instantiateViewControllerWithIdentifier("childView") as ChildViewController
goNext.delegate = self
self.navigationController?.pushViewController(goNext, animated: true)
Вызов метода
self.delegate?.childViewControllerResponse(parameter)
Если вы хотите отправить данные, нажав, вы сделали бы что-то вроде:
func goToFirstViewController() {
let a = self.navigationController.viewControllers[0] as A
a.data = "data"
self.navigationController.popToRootViewControllerAnimated(true)
}
Расширение ответа ViewController
в случае, если ваш ViewController
не является первым VC в стеке, вот решение:
func popViewController() {
guard let myVC = self.navigationController?.viewControllers.first({ $0 is MyViewController }) else { return }
myVC.data = "data"
self.navigationController?.popViewController(animated: true)
}
Тем не менее, это решение сломается, если у вас есть 2 или более 2 MyViewController
в стеке. Так что используйте с умом.
Ответ, данный здесь, является немного сложным, довольно простым, просто используйте UINavigationControllerDelegate
class FirstNavigationController: UIViewController {
var value: String?
}
class SecondNavigationController: UIViewController, UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
guard let vc = navigationController.topViewController as? FirstNavigationController else { return }
vc.value = "Hello again"
}
}