岛之风豪格打我相同的解决方案方法,但我已经有一个更详细的回答开始,我将添加它。
比方说,你的两个视图控制器命名如下:
- 主/入口点:
ViewController
(vcA)
- 次视点:
ViewControllerB
(vcB)
您建立SEGUE从(vcA) -> (vcB)
开始,就像你在例子中做的那样
/* 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)
到(vcA)
的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)
在(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
}
}
执行示例:
只需在展开视图控制器中实现'prepareForSegue'并访问'destinationViewController',它将成为您展开的视图控制器。您可能会想要在故事板中提供展开顺序和标识符 – Paulw11
它提供了一个错误“没有标识符”btnSubmitSegue“'”。我在视图控制器中添加了segue标识符。我只用一个segue来连接两个视图控制器。我相信放松segue只是回到它以前的视图控制器没有任何额外的赛段?你能详细解释一下吗?一些代码,将不胜感激:) – ebby94
创建开卷SEGUE按往常一样 - 拖动到场景中的'exit'图标。现在,在左侧的对象检查器中,您将看到视图控制器,第一响应者和退出图标下方列出的展开顺序。您可以点击展开顺序并在右侧的检查器中给它一个标识符。 – Paulw11