传递数据与放风继续

我创build了两个视图控制器。 我从第一个到第二个创build了一个segue来传递数据。 现在我想从第二个视图控制器传递数据到第一个。 我经历了许多类似的问题,由于我缺乏关于如何平仓的知识,我无法实现这些。

ViewController.swift

class ViewController: UIViewController { var dataRecieved: String? @IBOutlet weak var labelOne: UILabel! @IBAction func buttonOne(sender: UIButton) { performSegueWithIdentifier("viewNext", sender: self) } override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!) { var svc: viewControllerB = segue.destinationViewController as! viewControllerB svc.dataPassed = labelOne.text } } 

这会将数据传递给视图控制器“viewControllerB”中的dataPassed。 说,现在我想要将一些数据从viewControllerB传递到ViewController中的dataRecieved。 我怎样才能做到这一点,只有放松segue而不是使用委托。 我很新,很快会得到详细的解释。

ØyvindHauge击败了我同样的解决方法 ,但正如我已经开始了一个更详细的答案,我也会添加它。


假设你的两个视图控制器命名如下:

  • 主/入口点: ViewController (vcA)
  • 辅助视图: ViewControllerB (vcB)

你从(vcA) -> (vcB)设置了segue,就像你在例子中做的那样

 /* in ViewController.swift */ // ... // segue ViewController -> ViewControllerB override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!) { if segue.identifier == "viewNext" { let viewControllerB = segue.destinationViewController as! ViewControllerB viewControllerB.dataPassed = labelOne.text } } 

接下来有点棘手的一点是,使用这种方法,用于将数据 (vcB)传回(vcB)的segue 也被添加到(vcA)的源中,作为@IBAction方法(而不是(vcB)的来源)。

 /* in ViewController.swift */ // ... // segue ViewControllerB -> ViewController @IBAction func unwindToThisView(sender: UIStoryboardSegue) { if let sourceViewController = sender.sourceViewController as? ViewControllerB { dataRecieved = sourceViewController.dataPassed } } 

之后,您可以通过(vcB)中的(vcB)一个button通过(vcA)的手动Exit segue,在(vcB)

在这里输入图像说明

下面是从(vcA)(vcB)传递文本的完整示例。 (可能)通过UITextField修改该文本,最后返回(可能)修改的文本到(vcA)


(vcA)来源:

 /* ViewController.swift: Initial view controller */ import UIKit class ViewController: UIViewController { var dataRecieved: String? { willSet { labelOne.text = newValue } } @IBOutlet weak var labelOne: UILabel! @IBAction func buttonOne(sender: UIButton) { performSegueWithIdentifier("viewNext", sender: self) } // set default labelOne text override func viewDidLoad() { super.viewDidLoad() labelOne.text = "Default passed data" } // segue ViewController -> ViewControllerB override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!) { if segue.identifier == "viewNext" { let viewControllerB = segue.destinationViewController as! ViewControllerB viewControllerB.dataPassed = labelOne.text } } // segue ViewControllerB -> ViewController @IBAction func unwindToThisView(sender: UIStoryboardSegue) { if let sourceViewController = sender.sourceViewController as? ViewControllerB { dataRecieved = sourceViewController.dataPassed } } } 

(vcB)源代码(请注意,此处的UITextFieldDelegate委托仅用于“本地” dataPassed属性的值,该属性将返回到(vcA)并分配给后者的dataRecieved属性)

 /* ViewControllerB.swift */ import UIKit class ViewControllerB: UIViewController, UITextFieldDelegate { var dataPassed : String? @IBOutlet weak var textField: UITextField! // set default textField text to the data passed from previous view. override func viewDidLoad() { super.viewDidLoad() textField.text = dataPassed // Handle the user input in the text field through delegate callbacks textField.delegate = self } // UITextFieldDelegate func textFieldShouldReturn(textField: UITextField) -> Bool { // User finished typing (hit return): hide the keyboard. textField.resignFirstResponder() return true } func textFieldDidEndEditing(textField: UITextField) { dataPassed = textField.text } } 

执行示例:

在这里输入图像说明

这是我将如何做到这一点:

  1. 在视图控制器1中创build一个sockets,如下所示:

     @IBAction func unwindToViewController1(segue: UIStoryboardSegue) { let foo = segue.sourceViewController.foo // TODO: Use foo in view controller 1 } 
  2. 连接视图控制器2(你打开的vc)如下所示。 从vc2中的黄色圆圈拖到“退出”。 应该popup视图控制器1的IBAction。 select它。 在这里输入图像说明

  3. 现在,无论何时从视图控制器2放松,视图控制器1中的unwindToViewController1:方法都会被调用。

  4. 这是你将从视图控制器2中检索你想要的属性的地方。注意,你需要将segue.sourceViewController为你自定义的视图控制器子类,以获得正确的属性。