无法推送,因为self.navigationController为nil [英] Can't push because self.navigationController is nil

查看:143
本文介绍了无法推送,因为self.navigationController为nil的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将导航控制器显示为弹出窗口.第一次这样做,任何问题我都可以推送到另一个View Controller.但是,第二次以与我无法执行推送相同的方式呈现另一个控制器,因为呈现的Controller的self.navigationController为nil.这是我用来展示控制器的代码

I'm presenting a Navigation Controller as a popover. First time a do it I can push to another View Controller with any issue. But, second time a present another controller the same way I can't perform a push because the self.navigationController of the presented Controller is nil. This is the piece of code I'm using to present the Controller

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中使用.

Note: The Navigation Controller is always presented, but just the first time I perform pushes. And this code is for be used in iPad.

推荐答案

由于情节提要的本质,并且无法在此处显示,因此我不确定您的问题出在哪里.

Because of the nature of Storyboards and not being able to show that here, I'm not sure where your issue is exactly.

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

However I successfully setup a project that works using segues. I changed your code to the following:

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)

To present this popover I set up this IBAction in my ViewController (sender in my case was a 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)
        }
    }

可能出现的最后一件事是,确保您的segue对所有segue使用segue类型"show",以确保它们之间的过渡使用导航控制器push:

The last thing that could be the issue is make sure your segues are using the segue type "show" for all the segues to make sure the transition between them use the navigation controller push:

希望这会有所帮助!

这篇关于无法推送,因为self.navigationController为nil的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆