尝试在另一个故事板中打开时,iOS SideMenu崩溃

时间:2017-01-10 18:23:58

标签: ios swift xcode uiviewcontroller

我对iOS和Swift没什么经验,我正在尝试创建一个SlideOut菜单,或者在Android上调用的NavigationDrawer。 到目前为止,我正在使用这个library(由JonkyKong创建的SideMenu)因为它可以轻松定制,并且如GitHub上的Read-Me所述,它可以在所有屏幕上全局使用。

这是我的问题:在我的菜单上tableViewController我有两个storyboard segues,一个到主故事板,一个到第二个故事板。如果我切换到第二个故事板,当我尝试打开菜单时,应用程序崩溃时出现以下错误:Application tried to present modally an active controller

我做的菜单设置如下

在我的AppDelegate.swift文件中,我写了didFinishLaunchingWithOptions函数:

 var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // Override point for customization after application launch.

    // I've placed the menu ViewController on it's own storyboard, so I load it here to be used in the next line
    let navDrawerStoryBoard = UIStoryboard.init(name: "NavDrawer", bundle: nil)

    // Loads the menu
    SideMenuManager.menuLeftNavigationController = navDrawerStoryBoard.instantiateViewController(withIdentifier: "LeftMenuNavigationController") as? UISideMenuNavigationController

    // Here I'm setting a gesture recognizer to show the menu
    SideMenuManager.menuAddScreenEdgePanGesturesToPresent(toView: window!)

    return true

}

我还将我的项目上传到GitHub,以防有人需要它:sideMenuTest

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您正在获得该主要异常,因为您在已打开的菜单上以模态方式呈现第二个视图。

SideMenu在所有视图中共享一个菜单实例,因此如果菜单已在模态第二视图下方打开,则再次打开它会导致您看到的异常。

上面的解决方案是在故事板中使用“显示”segue类型而不是模态板: Show instead of modal

然后,在执行show之后,您还需要在NavigationController中嵌入初始视图: Embed in nav

接下来,假设您希望它保持相同,请隐藏导航栏: enter image description here

最后*,如果您想要顺利导航回到第一个屏幕,则需要在推送时跳过导航控制器。在NavDrawer故事板中,为故事板参考添加ID: enter image description here

并添加与相应控制器的Storyboard ID相同的ID: enter image description here

* 在我的测试中,我不得不将segue删除到第一个屏幕并重新创建它以使其工作。

答案 1 :(得分:0)

尝试添加

//this should be the view controller you want to show
self.window?.rootViewController = SideMenuManager.menuLeftNavigationController
self.window?.makeKeyAndVisible()

并最好在viewDidLoad

ViewController中添加手势

答案 2 :(得分:0)

尝试将每个视图控制器嵌入到导航视图控制器中。

Embed in Navigation View Controller