传递数据与放风继续
我创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中创build一个sockets,如下所示:
@IBAction func unwindToViewController1(segue: UIStoryboardSegue) { let foo = segue.sourceViewController.foo // TODO: Use foo in view controller 1 }
-
连接视图控制器2(你打开的vc)如下所示。 从vc2中的黄色圆圈拖到“退出”。 应该popup视图控制器1的IBAction。 select它。
-
现在,无论何时从视图控制器2放松,视图控制器1中的
unwindToViewController1:
方法都会被调用。 -
这是你将从视图控制器2中检索你想要的属性的地方。注意,你需要将
segue.sourceViewController
为你自定义的视图控制器子类,以获得正确的属性。