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 例程。您需要选择您在第一个屏幕中已经准备好的那个(您要返回的那个)。

然后像奶油一样光滑