如何使用segue将数据从First ViewController直接传递到Third View Controller?

时间:2018-08-20 10:32:55

标签: ios swift segue swift4

我能够执行将值从一个视图控制器传递到另一个视图控制器的任务。我在一个视图控制器中有一个textField和Submit按钮,在另一个视图控制器中有一个标签,在将输入文本输入到textField之后,我可以用textField的文本替换标签文本。

但是现在我要尝试的是,当我单击第一个视图控制器中的Submit按钮时,它应该移至第二个视图控制器(performSegue),同时应将值传递给第三个视图控制器。 / p>

但是,如果这样做,我会遇到错误,是否有一种简单的方法将值从一个视图控制器传递到第三个视图控制器,在这里我可以跳过目标和目标之间的“ n”个视图控制器?

这是一个例子:

  

假设有三个viewController,第一个viewController有一个   textField和一个提交按钮,第二个视图控制器具有一个“ NEXT”   按钮,并且第三个View Controller带有标签。

当我输入textField并单击Submit时,它应该将textField.text提交给第三个View Controller,并应该对第二个View Controller执行segue

现在当我在第二个视图控制器上时,它将显示NEXT按钮。单击下一步后,它将带我到第三个View控制器,在该控制器中,我将在标签中向我显示第一个View COntroller的textField文本...

我的问题是,该怎么做?我观看了很多有关实现隔离的youtube视频,但是没有人谈论如何通过跳过某些视图控制器将数据从一个视图控制器传递到另一个视图控制器。

希望您能理解我的问题。

您的时间和帮助将不胜感激! 谢谢

3 个答案:

答案 0 :(得分:0)

将storybordID分配给您的控制器,例如在这里我已经分配了“ HomeVC”(如果您将类名和storybordid分配相同,那就更好了)

  let objthirdController = self.storyboard?.instantiateViewController(withIdentifier: "thirdControllerStoerybordID") as! thirdControllerclassname
  objthirdController.variable = self.variable
   self.navigationController?.pushViewController(objthirdController, animated: true)

答案 1 :(得分:0)

您可以执行将值从一个视图控制器传递到另一个视图控制器的任务的方式。 在下一个控制器中时重复同样的步骤,直到到达目标视图控制器为止。

答案 2 :(得分:0)

  

您应该使用Notification Observer Design Pattern,但最好将其传递给视图控制器,而不是直接传递给目标ViewController,但这是解决方案:

struct NotificationKeys {
    static let myKey = "myKey"
}

class SourceViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func yourButtonPressed(_ sender: UIButton) {
        let name = Notification.Name(rawValue: NotificationKeys.myKey)
        NotificationCenter.default.post(name: name, object: nil)
        performSegue(withIdentifier: "identifier", sender: self)
    }
}
  

您也可以通过对象传递,也可以通过对象传递,   如果您不了解代码,只需在Google的NotificationCenter中搜索传递数据即可;)

class DestinationViewController: UIViewController {

    deinit {
        NotificationCenter.default.removeObserver(self)
    }

    @IBOutlet weak var yourLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        createObserver()
    }

    func createObserver() {
        NotificationCenter.default.addObserver(self, selector: #selector(updateLabel(notification:)), name: Notification.Name(rawValue: NotificationKeys.myKey), object: nil)
    }

    @objc func updateLabel(notification:NSNotification) {
        let isText = notification.name.rawValue == NotificationKeys.myKey
        let text = isText ? "\(isText)" : ""
        yourLabel?.text = text
    }
}