Swift 使用 Segue Return 参数
Swift Use Segue Return Parameter
我使用 "performSegueWithIdentifier()" 从 'A-VIEW' 跳转到 'B-VIEW'
现在,我要return给A,B携带参数传给A
乙:
protocol changeDelegate : NSObjectProtocol{
func returnCard(controller:UIViewController,labelText:NSString)
}
var delegate:changeDelegate?
@IBAction func rrrr(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion:{
println("start")
self.delegate?.returnCard("1234")
})
}
甲:
class AViewController: UIViewController,changeDelegate{
....
func returnCard(labelText: NSString) {
println(labelText)
}
}
不输出
您可以使用提供的 Exit(即展开您的 segue)。
在您的第一个视图控制器中,您需要添加一个 IBAction 函数,并将 UIStoryboardSegue 作为参数。这里我们称之为 @IBAction func unwindFromSecondVC(segue: UIStoryboardSegue)
。在其中您将能够访问您返回的视图控制器。
在您的第二个视图控制器中,您可以执行您必须执行的操作。
在视图本身(故事板)中,您只需放置一个按钮以便在需要时返回。 Link 这个按钮到视图控制器的退出(顶部的橙色方块,见底部的捕获)。 如果您不需要按钮,也可以通过编程方式完成。
ViewController.swift :
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Here, you pass your parameter(s) to the secondVC.
}
@IBAction func unwindFromSecondVC(segue: UIStoryboardSegue) {
// Here you can receive the parameter(s) from secondVC
let secondVC : SecondViewController = segue.sourceViewController as SecondViewController
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
第二ViewController.swift
import UIKit
class SecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// You can do stuff here (but to go forward not backward in segue).
// But in your case, see firstVC.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
故事板:
来自另一个 Q/A 的示例:http://goo.gl/J35mC6
这是我用过的:
protocol ValueReturner {
var returnValueToCaller: ((Any) -> ())? { get set }
}
在答:
override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
if let secondViewController = segue.destinationController as? ValueReturner {
secondViewController.returnValueToCaller = someFunctionThatWillHandleYourReturnValue
}
}
func someFunctionThatWillHandleYourReturnValue(returnedValue: Any) {
// cast returnedValue to the returned value type and do what you want. For example:
if let string = returnedValue as? String {
println(string)
}
}
在 B 中:
class SecondViewController: NSViewController, ValueReturner {
var returnValueToCaller: ((Any) -> ())?
@IBAction func rrrr(sender: AnyObject) {
returnValueToCaller?("1234")
dismissViewController(self)
}
}
这样,SecondViewController 就不必了解 FirstViewController 的任何信息,它可以传回任何值。我没有尝试使用 dismissViewControllerAnimated,所以我不知道它是否有效。
这个谜语的关键是显而易见的。
当您在第二个屏幕(您返回的那个屏幕)上连接按钮时,按住 Ctrl 将其拖到 Exit,它会为您提供一堆 IBAction 例程。您需要选择您在第一个屏幕中已经准备好的那个(您要返回的那个)。
然后像奶油一样光滑
我使用 "performSegueWithIdentifier()" 从 'A-VIEW' 跳转到 'B-VIEW'
现在,我要return给A,B携带参数传给A
乙:
protocol changeDelegate : NSObjectProtocol{
func returnCard(controller:UIViewController,labelText:NSString)
}
var delegate:changeDelegate?
@IBAction func rrrr(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion:{
println("start")
self.delegate?.returnCard("1234")
})
}
甲:
class AViewController: UIViewController,changeDelegate{
....
func returnCard(labelText: NSString) {
println(labelText)
}
}
不输出
您可以使用提供的 Exit(即展开您的 segue)。
在您的第一个视图控制器中,您需要添加一个 IBAction 函数,并将 UIStoryboardSegue 作为参数。这里我们称之为 @IBAction func unwindFromSecondVC(segue: UIStoryboardSegue)
。在其中您将能够访问您返回的视图控制器。
在您的第二个视图控制器中,您可以执行您必须执行的操作。 在视图本身(故事板)中,您只需放置一个按钮以便在需要时返回。 Link 这个按钮到视图控制器的退出(顶部的橙色方块,见底部的捕获)。 如果您不需要按钮,也可以通过编程方式完成。
ViewController.swift :
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Here, you pass your parameter(s) to the secondVC.
}
@IBAction func unwindFromSecondVC(segue: UIStoryboardSegue) {
// Here you can receive the parameter(s) from secondVC
let secondVC : SecondViewController = segue.sourceViewController as SecondViewController
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
第二ViewController.swift
import UIKit
class SecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// You can do stuff here (but to go forward not backward in segue).
// But in your case, see firstVC.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
故事板: 来自另一个 Q/A 的示例:http://goo.gl/J35mC6
这是我用过的:
protocol ValueReturner {
var returnValueToCaller: ((Any) -> ())? { get set }
}
在答:
override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
if let secondViewController = segue.destinationController as? ValueReturner {
secondViewController.returnValueToCaller = someFunctionThatWillHandleYourReturnValue
}
}
func someFunctionThatWillHandleYourReturnValue(returnedValue: Any) {
// cast returnedValue to the returned value type and do what you want. For example:
if let string = returnedValue as? String {
println(string)
}
}
在 B 中:
class SecondViewController: NSViewController, ValueReturner {
var returnValueToCaller: ((Any) -> ())?
@IBAction func rrrr(sender: AnyObject) {
returnValueToCaller?("1234")
dismissViewController(self)
}
}
这样,SecondViewController 就不必了解 FirstViewController 的任何信息,它可以传回任何值。我没有尝试使用 dismissViewControllerAnimated,所以我不知道它是否有效。
这个谜语的关键是显而易见的。
当您在第二个屏幕(您返回的那个屏幕)上连接按钮时,按住 Ctrl 将其拖到 Exit,它会为您提供一堆 IBAction 例程。您需要选择您在第一个屏幕中已经准备好的那个(您要返回的那个)。
然后像奶油一样光滑