Подтвердить что ты не робот

Как отправить данные обратно popViewControllerAnimated для Swift?

Мне нужно отправить некоторые данные обратно из SecondView в First View по popView. Как я могу отправить данные по popViewControllerAnimated?

Спасибо!

4b9b3361

Ответ 1

Вы можете передать данные обратно, используя delegate

  1. Создать protocol в ChildViewController
  2. Создать переменную delegate в ChildViewController
  3. Продлить ChildViewController протокол в MainViewController
  4. Дайте ссылку на ChildViewController из MainViewController при navigate
  5. Определить метод delegate в MainViewController
  6. Затем вы можете вызвать метод 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)

Ответ 2

Если вы хотите отправить данные, нажав, вы сделали бы что-то вроде:

func goToFirstViewController() {
  let a = self.navigationController.viewControllers[0] as A
  a.data = "data"
  self.navigationController.popToRootViewControllerAnimated(true)
}

Ответ 3

Расширение ответа 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 в стеке. Так что используйте с умом.

Ответ 4

Ответ, данный здесь, является немного сложным, довольно простым, просто используйте 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"
    }
}