从目标视图控制器推送新的视图控制器 (swift)

Push new View Controller from destination View Controller (swift)

我正在尝试获取目标视图控制器以推送新的视图控制器,但我似乎无法以编程方式或通过情节提要片段获取它。

这是我正在尝试做的事情:

我有 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 的原因是我需要用户能够使用 "back" 按钮从视图控制器 C 导航回视图控制器 A...不是从视图控制器 C 返回到视图控制器 B。

本质上,我尝试创建的流程是视图 A -> 模态视图 B -> 视图 C ---> 返回视图 A,就好像视图 B 消失了一样(因为它应该消失)。 请注意,但是,在视图 A 推送到视图 C 之前,视图 B 确实需要能够设置视图 C 的 IDToDisplay 值。

有没有一种干净的(标准的)方法来实现这个?或者我将不得不变得笨拙?

用户是否按下了 viewController C 中的按钮? 如果是这样,你可以使用这个:

self.navigationController?.popToRootViewControllerAnimated(true)

只需将它添加到您在 viewController C 中按下按钮的位置,它应该会返回到 A

您可以通过两种方式解决这个问题

第一个选项:您可以在 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
        }
   }
}

希望对你有所帮助