ebb*_*y94 31 ios segue swift unwind-segue
我创建了两个视图控制器.我从第一个到第二个创建了一个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
}
}
Run Code Online (Sandbox Code Playgroud)
这会将数据传递给视图控制器"viewControllerB"中的dataPassed.说,现在我想将一些数据从viewControllerB传递到ViewController中的dataRecieved.如何只使用unwind segue而不是使用委托来完成此操作.我对迅捷很新,会很感激详细解释.
dfr*_*fri 61
Ø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
}
}
Run Code Online (Sandbox Code Playgroud)
在有些麻烦步骤接下来的是,使用该方法,用于传递数据回SEGUE 从 (vcB) 到 (vcA)被也加到源(vcA),作为@IBAction方法(而不是象可能被预期的,添加到源(vcB)).
/* in ViewController.swift */
// ...
// segue ViewControllerB -> ViewController
@IBAction func unwindToThisView(sender: UIStoryboardSegue) {
if let sourceViewController = sender.sourceViewController as? ViewControllerB {
dataRecieved = sourceViewController.dataPassed
}
}
Run Code Online (Sandbox Code Playgroud)
然后你通过手动segue 连接说,一个按钮(vcB)进入这个展开动作:(vcA)Exit(vcB)
下面从如下文本通过一个完整的例子(vcA)来(vcB); (可能)通过a修改该文本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
}
}
}
Run Code Online (Sandbox Code Playgroud)
(vcB)source(请注意,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
}
}
Run Code Online (Sandbox Code Playgroud)
执行示例:
oyv*_*uge 14
我就是这样做的:
在视图控制器1中创建一个插座,如下所示:
@IBAction func unwindToViewController1(segue: UIStoryboardSegue) {
let foo = segue.sourceViewController.foo
// TODO: Use foo in view controller 1
}
Run Code Online (Sandbox Code Playgroud)连接视图控制器2(您正在展开的vc),如下所示.从vc2中的黄色圆圈拖动到"退出".应该弹出视图控制器1的IBAction.选择它.

现在,每当您从视图控制器2中展开时,视图控制器1中的unwindToViewController1:方法将被调用.
这是您从视图控制器2中检索所需属性的位置.请注意,您需要将其转换segue.sourceViewController为自定义视图控制器子类才能获得正确的属性.
| 归档时间: |
|
| 查看次数: |
17051 次 |
| 最近记录: |