Swift使用Segue返回参数

时间:2015-02-28 09:20:09

标签: swift segue

我使用'A-VIEW'中的“performSegueWithIdentifier()”跳转到'B-VIEW'

现在,我要返回A,B将参数传输到A

B:

  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")
    })

}

A:

class AViewController: UIViewController,changeDelegate{

....

func returnCard(labelText: NSString) {
        println(labelText)
}
}

不输出

3 个答案:

答案 0 :(得分:3)

您可以使用提供的退出(即展开您的segue)。

在第一个视图控制器中,您需要添加一个IBAction函数,并将UIStoryboardSegue作为参数。在这里,我们称之为@IBAction func unwindFromSecondVC(segue: UIStoryboardSegue)。在其中您将能够访问您正在返回的视图控制器。

在第二个视图控制器中,您可以执行必须执行的操作。 在视图本身(故事板)中,您只需放置一个按钮,以便在需要时返回。将此按钮链接到视图控制器的“退出”(顶部的橙色方块,请参见底部的捕获)。 如果您不需要按钮,也可以通过编程方式完成。

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()
    }

}

<强> SecondViewController.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()
    }

}

故事板: 来自其他问答的示例:http://goo.gl/J35mC6

Storyboard

答案 1 :(得分:1)

这就是我用过的:

protocol ValueReturner {
    var returnValueToCaller: ((Any) -> ())?  { get set }
}

在A:

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,所以我不知道这是否有效。

答案 2 :(得分:0)

这个谜语的关键是如此明显。

当你连接第二个屏幕上的按钮(你要返回的那个按钮)时,按住Ctrl键将它拖到Exit,它会为你提供一堆IBAction例程。您需要在第一个屏幕(您要返回TO的屏幕)中选择您已准备好的那个。

然后它就像奶油一样光滑。