SWRevealViewController insertObject:atIndex对象不能为nil

时间:2014-09-25 14:27:14

标签: ios objective-c menu xcode6 swrevealviewcontroller

我是一个带有storyboard的新开发者。我尝试使用滑出式菜单制作应用。 为此,我使用库:SWRevealViewController和教程:http://www.appcoda.com/ios-programming-sidebar-navigation-menu/

我按照教程,但我加载应用程序,我有这个错误:

  

由于未捕获的异常而终止应用   ' NSInvalidArgumentException',原因:' *** - [__ NSArrayM   insertObject:atIndex:]:object不能为nil'

我的应用程序崩溃在这一行:

  [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];

如何设置self.revealViewController?

这里我的故事板更新

enter image description here

要了解我的应用程序,startviewController用于下载和存储数据,下载后,将显示mainViewcontroller。

我想在我的mainviewcontroller上滑出菜单,但我不能这样做。

这里我添加到mainviewController viewdidload的代码:

   - (void)viewDidLoad
    {
        [super viewDidLoad];
         self.contentView.autoresizesSubviews = YES;
        _sharedUser = [User sharedUser];

        ///slide out menu
        // Change button color
         //SWRevealViewController *revealViewController = [self.navigationController.storyboard instantiateViewControllerWithIdentifier:@"RevealViewController"];


        _sidebarButton.tintColor = [UIColor redColor];

        // Set the side bar button action. When it's tapped, it'll show up the sidebar.
        _sidebarButton.target = self.revealViewController;
        _sidebarButton.action = @selector(revealToggle:);

        // Set the gesture
        [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];



        //end slide out



        self.contentView.backgroundColor = [UIColor cyanColor];


        if (_sharedUser.tokenString) {

        }
        else{

            [self showHomeWithoutLogginView];

        }



    }

3 个答案:

答案 0 :(得分:2)

我正在查看您关注的教程。根据你的截图,你的故事板中缺少一些东西。

RevealViewController应与两个控制器连接:前视图控制器(用于显示内容)和后视图控制器(用于显示导航菜单):

enter image description here

图片的致谢:http://www.appcoda.com/ios-programming-sidebar-navigation-menu/

这些连接(segues)应标记为"显示视图控制器"并且每个都必须相应地命名:" sw_front"和" sw_rear"。

然后,您必须在导航菜单(后视图控制器)中添加菜单项,并将每个单元格连接到相应的viewController,为segue指定名称并将其标记为SWRevealViewController类。您可能希望将前视图控制器连接到要首先显示的viewController。

我强烈建议您按原样制作教程。我想我过去使用它并且效果很好。如果您对此有任何疑问,请不要犹豫。

祝你好运!

答案 1 :(得分:1)

<强>解决 感谢leandro!

这里是我的staviewcontroller中需要解决我问题的代码:

 SWRevealViewController *sideBar = [self.navigationController.storyboard instantiateViewControllerWithIdentifier:@"SWRevealViewController"];


 [self.navigationController pushViewController:sideBar animated:YES];

答案 2 :(得分:0)

您使用的是SWRevealViewController的latest version吗? AppCoda教程已经过时,SWReveal在Git上有很好的样本。

在故事板上检查您的segue 标识符。你设置了sw_front和sw_rear吗?此外,在最新版本中,用于设置菜单/前视图的segue应为:SWRevealViewControllerSegueSetController,而不是旧的SWRevealViewControllerSegue

修改

另请注意,调用[self.revealController panGestureRecognizer];足以启用手势;不需要额外的手势。

修改

尝试初始化如下:

MenuViewController *menuVC = [self.storyboard instantiateViewControllerWithIdentifier:@"MenuViewController"];

UINavigationController *frontNavigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNavigationController"];

SWRevealViewController *revealViewController = [[SWRevealViewController alloc] initWithRearViewController:menuVC frontViewController:frontNavigationController];

修改

您可以尝试在菜单按钮中添加操作,如下所示:

[menuButton addTarget:self.revealViewController action:@selector(revealToggle:)
         forControlEvents:UIControlEventTouchUpInside];