是否可以使用单一的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开发一般都很陌生,任何帮助都将不胜感激!
答案 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
)但它是一个强大的模式。