从目标View Controller推送新的View Controller(swift)

时间:2015-08-13 01:16:50

标签: ios iphone swift uiviewcontroller uistoryboardsegue

我正在尝试使用目标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值。

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

2 个答案:

答案 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