Øyvind Hauge已经用相同的解决方法击败了我,但是由于我已经开始了更详细的答案,所以我也会添加它。
假设您的两个视图控制器命名如下:
- 主/入口点:
ViewController
(vcA)
- 辅助视图:
ViewControllerB
(vcB)
您可以像在您的示例中一样从(vcA) -> (vcB)
设置segue
override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!)
{
if segue.identifier == "viewNext" {
let viewControllerB = segue.destinationViewController as! ViewControllerB
viewControllerB.dataPassed = labelOne.text
}
}
接下来有点棘手的一步是,使用这种方法,用于将数据从 (vcB)
传回 (vcA)
的Segue也会被添加到(vcA)
的源代码中,作为一个@IBAction
方法(而不是可能期望的添加到(vcB)
的源代码中)。
@IBAction func unwindToThisView(sender: UIStoryboardSegue) {
if let sourceViewController = sender.sourceViewController as? ViewControllerB {
dataRecieved = sourceViewController.dataPassed
}
}
然后,您需要通过在 (vcB)
中使用手动 Exit
转场,在(vcB)
中将一个按钮连接到(vcA)
中的此 unwind 动作:
以下是从(vcA)
传递文本到(vcB)
的完整示例;(可能)通过UITextField
修改该文本,最终将(可能)修改后的文本返回给(vcA)
。
(vcA)
源代码:
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)
}
override func viewDidLoad() {
super.viewDidLoad()
labelOne.text = "Default passed data"
}
override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!)
{
if segue.identifier == "viewNext" {
let viewControllerB = segue.destinationViewController as! ViewControllerB
viewControllerB.dataPassed = labelOne.text
}
}
@IBAction func unwindToThisView(sender: UIStoryboardSegue) {
if let sourceViewController = sender.sourceViewController as? ViewControllerB {
dataRecieved = sourceViewController.dataPassed
}
}
}
(vcB)
source (注意这里的UITextFieldDelegate
代理仅用于“本地”改变dataPassed
属性的值,该值将被返回给(vcA)
并分配给后者的dataRecieved
属性)
import UIKit
class ViewControllerB: UIViewController, UITextFieldDelegate {
var dataPassed : String?
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.text = dataPassed
textField.delegate = self
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
func textFieldDidEndEditing(textField: UITextField) {
dataPassed = textField.text
}
}
示例执行:
prepareForSegue
,并访问destinationViewController
,这将是您要反向传递到的视图控制器。您可能希望在Storyboard中为您的反向传递segue指定一个标识符。 - Paulw11