我正在尝试使用目标View Controller来推送新的View Controller,但我似乎无法以编程方式或通过storyboard segues获取它。
这是我正在尝试做的事情:
我有3个视图控制器(我们称之为A,B和C)。这三个都是在故事板中创建的(设计?)。我从视图控制器A开始,当用户按下按钮时,我想以模态方式呈现视图控制器B,然后当用户在视图控制器B中选择一个单元格时,我希望视图控制器B被解除(模态),并且我希望视图控制器A推送一个新的视图控制器(视图控制器C)。
到目前为止,我试图实现这个的方式是当用户按下视图控制器A中的按钮时,我以编程方式模拟推动视图控制器B,然后当用户在视图控制器B中选择一个单元格时,我向后移动查看控制器A,并尝试从视图控制器B的prepareForSegue函数推送视图控制器C,如下所示:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let viewA = segue.destinationViewController as? ViewControllerA {
let cell = sender as! ViewControllerBTableViewCell
var viewC = storyboard?.instantiateViewControllerWithIdentifier("viewControllerC") as! ViewControllerC
viewC.IDToDisplay = cell.userID
viewA.navigationController?.pushViewController(viewC, animated: true)
self.dismissViewControllerAnimated(true, completion: nil)
}
}
然而,当我运行这个...视图控制器C永远不会被推!
我需要从视图控制器A推送视图控制器C的原因是我需要用户能够使用“后退”按钮从视图控制器C导航回查看控制器A ...不返回视图控制器B来自视图控制器C.
基本上我正在尝试创建的流程是视图A - >以模态方式查看B - >查看C --->回到视图A,好像视图B消失了(因为它应该)。 请注意,但是,视图B确实需要能够在视图A推送到视图C之前设置视图C的IDToDisplay
值。
有没有干净(标准)的方法来实现这个?或者我将不得不变得笨拙?
答案 0 :(得分:1)
您可以通过两种方式解决此问题
第一个选项:您可以在B控制器中创建一个clousure var并在解除B控制器之前执行它
例如:在BController中
class BTableViewController: UITableViewController {
var pushClosure:(()->())?
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
pushClosure?()
self.navigationController?.dismissViewControllerAnimated(true, completion: nil)
}
}
在prepareForSegue的控制器中执行类似的操作
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "SegueID" {
let nextView:BController = segue.destinationViewController as! BController
nextView.pushClosure = {
self.performSegueWithIdentifier("SegueID To C Controller", sender:nil)
}
}
}
第二个选项是实现自己的委托 在BController中
protocol ClassNameDelegate{
func pushToC()
}
class ClassName: NSObject {
var delegate:ClassNameDelegate?
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.delegate.pushToC()
self.navigationController?.dismissViewControllerAnimated(true, completion: nil)
}
}
在A控制器中
class AViewController:ClassNameDelegate{
func pushToC(){
self.performSegueWithIdentifier("SegueID To C Controller", sender:nil)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "SegueID" {
let bController:BController = segue.destinationController as! BController
bController.setDelegate = self
}
}
}
我希望它可以帮到你。
答案 1 :(得分:0)
用户是否在viewController C中按了一个按钮? 如果是这样,你可以使用它:
self.navigationController?.popToRootViewControllerAnimated(true)
只需将其添加到您在viewController C中按下按钮的位置,它应该返回到A