push 在以模态方式呈现的控制器上不起作用

Posted

技术标签:

【中文标题】push 在以模态方式呈现的控制器上不起作用【英文标题】:push is not working on the controller which was presented modally 【发布时间】:2016-02-12 19:25:56 【问题描述】:

您好,我在 FirstViewController 上有一个按钮,我将一个 segue 从 firstViewController 拖到 secondViewController 作为 segue Modally。现在在 secondViewController 上,我正在以编程方式生成一个 Button 并继续在第三个控制器上,我正在推动控制器(segue Push)但它不起作用。第三个控制器没有出现。单击自定义按钮时没有任何反应。

这是第二个ViewController的代码

 func nextButtonClicked(sender:UIButton!)
    let takeProductPhotoController = self.storyboard!.instantiateViewControllerWithIdentifier("takeProductPhotoController") as! TakeProductPhotoController
            takeProductPhotoController.trip = trip
            self.navigationController?.pushViewController(takeProductPhotoController, animated: true)

注意:我不需要第二个视图控制器上的 NavigationBar,因此在模态显示它时它没有显示 navigationBar。但我需要第三个导航栏。所以这就是我推动导航控制器的原因

【问题讨论】:

【参考方案1】: 当你想从弹出的控制器推送时,你必须创建 新的NavigationController & 还设置了你的ViewController 想以rootViewController of navigationController 的形式呈现模态。 当我们想要呈现SecondViewcontrollermodally 时,我们正在呈现 rootViewController 设置为 SecondViewController 的导航控制器。所以我们 已创建新的导航堆栈。之后我们将 将控制器推送到在呈现 SecondViewController 时创建的新导航堆栈中。

1) 你的代码应该是这样的 在FirstViewController

let secondViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("aIdentifier") as! SecondViewController 
    let nav = UINavigationController(rootViewController: SecondViewController )
    self.presentViewController(nav, animated:true, completion:nil)

2) 从secondViewController 你可以将ThirdViewController 推入 self.naviagtionController。 在按钮操作的 SecondViewController 中编写以下代码

let thirdViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("cIdentifier") as! ThirdViewController self.navigationController?.pushViewController(thirdViewController , animated: true)

【讨论】:

好吧你的意思是我必须写这段代码..让导航: UINavigationController = UINavigationController(rootViewController: self.storyboard!.instantiateViewControllerWithIdentifier("takeProductPhotoController") as! TakeProductPhotoController) self.navigationController?.pushViewController(导航,动画:真)? 是的,这就是我的意思,但使用导航控制器而不是 push@hellosheikh 您能否提供确切的语法,因为我正在努力使其工作。我已经尝试过这个 var rootViewController = self.window.rootViewController as UINavigationController let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main ", bundle: nil) var takeProductPhotoController = mainStoryboard.instantiateViewControllerWithIdentifier("takeProductPhotoController") as! TakeProductPhotoController rootViewController.pushToViewController(takeProductPhotoController, animated: true) 问题是 self.window 在这个 VC 中不可用,所以出现语法错误 好的,感谢您的代码正常工作,但控制器从底部弹出,就像模态控制器弹出一样。我希望控制器像 push segue 一样出现 secondViewController 将从底部弹出,如果您将控制器推到第二个控制器上,它将显示为 push【参考方案2】:

好的,我在这里详细发布了我在做什么以及我为解决 Rohit Answer 帮助我的问题所做的工作。

我的 FirstVC 在 IB 中通过 segue 连接到 SecondVCpresentModally。然后在 SecondVC 中尝试推送ThirdVC

let thirdVC = self.storyboard!.instantiateViewControllerWithIdentifier("thirdVC") as! ThirdVC

  self.navigationController?.pushViewController(thirdVC, animated: true)

没有用。

所以为了解决这个问题,我从 IB 中删除了 FirstVCSecondVC 之间的 segue,并在我的 firstVC 中编写了这段代码

let secondVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("secondVC") as! SecondVC
        let nav = UINavigationController(rootViewController: secondViewController )
        self.presentViewController(nav, animated:true, completion:nil)

然后在 secondVC

let thirdVC =   self.storyboard!.instantiateViewControllerWithIdentifier("thirdVC") as! ThirdVC

      self.navigationController?.pushViewController(thirdVC, animated: true)

它的工作原理

【讨论】:

记得在swift 4中presentViewController 被重命名为present

以上是关于push 在以模态方式呈现的控制器上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用模态呈现的 NavigationController(iOS 5 - Storyboard)时,委托不起作用

以模态方式呈现的 UIPopoverController 在 iOS 5 中不起作用

Bootstrap 模态在 iPhone 上不起作用

为啥这个方向代码不起作用?

performSegueWithIdentifier 不起作用

以编程方式滚动到顶部不起作用?