你能用一个prepareForSegue链接2个不同的视图吗?

时间:2015-11-30 21:00:00

标签: ios swift2 segue

是否可以使用单一的prepareForSegue()方法链接到两个不同的视图控制器?我有3个视图,需要能够从视图2查看1和3.视图控制器2是一个viewController,带有自定义tableview,单元格转到ViewController3,自定义后退按钮返回viewController1。

我一直在谷歌上搜索过这样的事情:

 @IBAction func newSearch(sender: AnyObject){
    dispatch_async(dispatch_get_main_queue(), {self.performSegueWithIdentifier("view1", sender: self) })}

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){if segue.identifier == "newSearch"{
       let destView1: ViewController1 = segue.destinationViewController as! ViewController1
    }else{
        let destView2 : ViewController3 = segue.destinationViewController as! ViewController3}

我目前能够点按一个单元格并转到ViewController3。然而,当我尝试点击newSearch按钮返回ViewController1时,我收到错误:

"无法转换类型' app.ViewController1'到' app.ViewController3'。"

我不完全理解为什么在通过正确的segue.identifier时我不会回去。但我对swift和iOS开发一般都很陌生,任何帮助都将不胜感激!

2 个答案:

答案 0 :(得分:0)

我认为您要做的是将数据传回上一个视图控制器,例如:

VC1 - > VC2 - > VC3

要将数据从VC2传递到VC1,您可以使用:

self.delegate.aFunctionInVC1("some data")
self.navigationController?.popViewControllerAnimated(true)

其中delegate是对VC1的引用。

所以当你从VC1推送VC2时,你应该这样做:

self.performSegueWithIdentifier("MyVC1ToVC2Segue", sender: self)

然后:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let vC2 = segue.destinationViewController as! VC2
    vC2.delegate = self
}

这最好作为协议实现。这是一个例子:

<强> VC1

protocol VC1Protocol {
    func doSomething(text: String)
}

class VC1: UIViewController, VC1Protocol {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func nextAction(sender: AnyObject) {
        self.performSegueWithIdentifier("MyVC1toVC2Segue", sender: self)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let vC2 = segue.destinationViewController as! VC2
        vC2.delegate = self
    }

    func doSomething(text: String) {
        print(text)
    }
}

<强> VC2

class VC2: UIViewController {

    var delegate: VC1Protocol!

    @IBAction func goBackAction(sender: AnyObject) {
        self.delegate.doSomething("Hello")
    }

}

答案 1 :(得分:0)

在导航到多个不同的ViewController之前,您经常使用单个prepareForSegue函数来设置内容,但这通常在当前视图将呈现目标视图时完成(使用'show'或'modal'时) SEGUE)。

听起来你想通过导航堆栈将移回。 Apple提供unwind segue作为在删除视图时将数据传递回父视图控制器的方法。

我花了一些时间来理解它(因为你实际上在父ViewController中创建了@IBAction)但它是一个强大的模式。