revealViewController()始终返回nil

5
我在使用Xcode 7.2和iOS 9.2中的revealViewController时遇到了一些问题。
我的应用程序以一个嵌入在导航控制器中的视图控制器开始,用于执行登录操作。登录后,或者如果登录令牌存在,我使用以下代码跳转到另一个嵌入在导航控制器中的视图控制器:
let homePage = self.storyboard?.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewController
let homePageNav = UINavigationController(rootViewController: homePage)
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.window?.rootViewController = homePageNav

在这个主页视图控制器中,我想要一个带有 SWRealViewController 的左侧导航菜单。
我已经将 SWRealViewController 视图与 sw_front 链接到我的主页导航控制器,并添加了以下代码:
if (self.revealViewController() != nil) {
    self.menuButton.target = self.revealViewController()
    self.menuButton.action = "revealToggle:"
self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())

但是self.revealViewController()总是返回空值,所以它不能正常工作。

我想我可能在某个地方丢失了revealViewController(也许是当我从第一个导航控制器跳转到第二个时),但我不知道该怎么办。


revealViewController 是如何声明的? - vadian
@Thomi 你是指SWRevealViewController吗? - Ismail
我按照这个教程进行操作:https://www.youtube.com/watch?v=EWDNScxZ0YU 我在我的Storyboard中有一个视图控制器,类别是SWRevealViewController。 - Thomi
3个回答

4
最方便的原因是 revealViewControllernil,可能是因为你没有在 stroyboard 中正确连接 segues

看看这个 tutorial,它非常容易理解。

更新 如果在你的情况下,只需要在用户未登录时打开登录视图控制器,可以这样做:

在 AppDelegate 中

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

   var rootVCStoryboardId = userIsLoggedin ? "SWRevealViewController" : "LoginViewController"
   self.window?.rootViewController = UIStoryboard(name: Storyboards.main, bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier(rootVCStoryboardId)

其中 SWRevealViewController 是 SWRevealViewController 的故事板 ID,而 LoginViewController 是您的登录视图控制器(如果存在,则为其导航控制器)的故事板 ID。

enter image description here


你能否与我分享你的项目(通过发送给我或使用TeamViewer)?我可能能够和你一起修复它。 - Ismail
很遗憾,这是不可能的。您需要哪些信息来查看我的问题? - Thomi
我在想...也许当登录完成后,我应该跳转到SWRevealViewController而不是我的HomeViewController。并使用sw_front将SWRevealViewController链接到HomeViewController。 - Thomi
我想知道你有什么初始视图控制器? - Ismail
这只是一个登录吗? - Ismail
显示剩余9条评论

3

如果有人想知道如何手动进行segue,这就是我最终的解决方案。

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    let sw = storyboard.instantiateViewControllerWithIdentifier("SWRevealViewController") as! SWRevealViewController

    self.view.window?.rootViewController = sw

    let destinationController = self.storyboard?.instantiateViewControllerWithIdentifier("StoryboardID") as! NameOfViewController

    let navigationController = UINavigationController(rootViewController: destinationController)

    sw.pushFrontViewController(navigationController, animated: true)

0
如果您根据当前用户信息跳过登录场景,则请确保使用SWRevealViewController实例化故事板。参考下面的代码:
if User.currentUser != nil {
        //There is a current user
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewControllerWithIdentifier("SWRevealViewController")
        window?.rootViewController = vc
    }
    else{
        //No current user
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接