【问题标题】:Can't push because self.navigationController is nil无法推送,因为 self.navigationController 为 nil
【发布时间】:2015-04-15 17:33:52
【问题描述】:

我将导航控制器呈现为弹出框。第一次这样做我可以推送到另一个有任何问题的视图控制器。但是,第二次呈现另一个控制器时,我无法执行推送,因为呈现的控制器的 self.navigationController 为零。这是我用来展示控制器的一段代码

func instantiateEditController(view : UIView) -> UINavigationController
{
    let popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("Edit Controller") as MCMEditController
    popoverContent.preferredContentSize = CGSizeMake(320, 480)
    let navController = MCMBaseNavigationController(rootViewController: popoverContent)
    navController.modalPresentationStyle = UIModalPresentationStyle.Popover
    navController.navigationBar.tintColor = UIColor.whiteColor()
    let popover = navController.popoverPresentationController
    popover?.sourceView = view
    popover?.sourceRect = CGRectMake(0, 0, view.frame.size.width, view.frame.size.height)

    return navController
}

注意:导航控制器总是出现,但只是在我第一次执行推送时。此代码是用于 iPad 的。

【问题讨论】:

  • navController.popoverPresentationController 属性有什么作用?为什么你试图将这个 popoverPresentationController 的 sourceView 设置为你传递给这个函数的视图?此外,如果您尝试使用 iPad 的弹出框,箭头指向它,您正在寻找的 api 是 UIPopoverController developer.apple.com/library/prerelease/ios/documentation/UIKit/…
  • 我正在使用传递给函数的视图作为弹出框的锚
  • @Drmorgan 使用 UIPopoverController 我可以展示我的导航控制器,但错误一直显示,第一次展示我可以推送到另一个控制器,第二次我不能
  • 你能展示如何将控制器推送到导航控制器上的代码吗?

标签: ios ipad popover


【解决方案1】:

由于故事板的性质,无法在此处展示,我不确定您的问题到底出在哪里。

但是,我成功地设置了一个使用 segues 工作的项目。我将您的代码更改为以下内容:

func instantiateEditController(view : UIView) -> UINavigationController
    {
        if let popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("Edit Controller") as? MCMEditController {
            popoverContent.preferredContentSize = CGSizeMake(320, 480)
            let navController = UINavigationController(rootViewController: popoverContent)
            navController.modalPresentationStyle = UIModalPresentationStyle.Popover
            navController.navigationBar.tintColor = UIColor.whiteColor()
            let popover = navController.popoverPresentationController
            popover?.sourceView = view
            popover?.sourceRect = CGRectMake(0, 0, view.frame.size.width, view.frame.size.height)

            return navController
        } else {
            return UINavigationController(rootViewController: self) // not recommend to keep this, I'm on Swift 1.2 and this was an easy fix to resolve the errors
        }
    }

为了呈现这个弹出框,我在我的 ViewController 中设置了这个 IBAction(在我的例子中,发送者是 UIButton

@IBAction func presentPopover(sender: AnyObject) {
        if let view = sender as? UIView {
            let controller = instantiateEditController(view)
            let popover = UIPopoverController(contentViewController: controller)
            popover.presentPopoverFromRect(view.frame, inView: self.view, permittedArrowDirections:UIPopoverArrowDirection.Any, animated: true)
        }
    }

最后可能出现的问题是确保您的转场对所有转场都使用转场类型“show”,以确保它们之间的转换使用导航控制器推送:

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    相关资源
    最近更新 更多