Øyvind Hauge 用同样的解决方案击败了我方法,但由于我已经开始提供更详细的答案,所以我也会添加它。
假设您的两个视图控制器命名如下:
- 主控/入口点:
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
}
}
接下来有点棘手的步骤是,使用这种方法,用于将数据传回 from (vcB) to (vcA) 的 segue 也是 /em> 添加到(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) 中的手册Exit 将(vcB) 中的按钮连接到(vcA) 中的此展开操作:
下面是一个将文本从(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
}
}
示例执行: