【问题标题】:SWRevealViewController insertObject:atIndex object cannot be nilSWRevealViewController insertObject:atIndex 对象不能为 nil
【发布时间】:2014-11-20 09:02:30
【问题描述】:

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

我按照教程进行操作,但我加载了应用程序,但出现此错误:

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'*** -[__NSArrayM insertObject:atIndex:]: 对象不能为 nil'

我的应用程序在此行崩溃:

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

如何设置 self.revealViewController ?

这里是我的故事板更新

为了了解我的应用,startviewController 用于下载和存储数据,下载后显示 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];

        }



    }

【问题讨论】:

  • prepareForSegue 方法的代码在哪里?放松心情后与教程交叉检查,因为该教程是正确的:)
  • 为您的 tableView 数据源添加代码行。代码中的一些 NSMutable 数组试图添加对象,但它是 nil。
  • 在“在导航菜单中添加菜单项”部分之前,教程中没有任何关于 prepareForSegue 方法的内容,能告诉我我需要写什么以及在哪里写吗? @Mayo323 错误来自 self.revealViewController 谁是零。我的 tableView 可以在没有数据的情况下显示。
  • 你完成了整个教程还是只完成了一部分?
  • 我没有完成它,我在“在导航菜单中添加菜单项”之前停止了。但它应该在理论上有效吗?

标签: ios objective-c menu xcode6 swrevealviewcontroller


【解决方案1】:

已解决 感谢莱德罗!

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

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


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

【讨论】:

  • 这是完整的代码吗?请写完整的代码解决你的问题
  • 是的,这是完整的代码,如果您遵循 SWRevealViewController 教程,使用故事板连接,您只需要在显示 sideBarController 之前使用它。 sideBarController 将显示您的主控制器。
【解决方案2】:

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

在情节提要上检查您的转场 identifierclass。 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];

【讨论】:

  • 是的,我使用的是最新的 ;) 我已经设置了 sw_front 和 sw_rear 并且我的 segue 是: SWRevealViewControllerSegueSetController 我和教程之间的区别是我使用 startviewcontroller 而我最初的 viewcontroller 不是 SWRevealViewController .suddenly 当我尝试使用 SWRevealViewController 时,它是 nil.... 我尝试像这样初始化:SWRevealViewController *revealViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SWRevealViewController"]; 但是当我单击按钮以显示幻灯片菜单时,我的应用程序因执行错误访问而崩溃..
  • 感谢您的回答,但是当我单击按钮以显示幻灯片菜单时,我的应用程序因执行错误访问而崩溃,我不知道为什么:(
【解决方案3】:

我正在查看您正在学习的教程。根据您的屏幕截图,您的故事板中缺少一些内容。

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

图片来源:http://www.appcoda.com/ios-programming-sidebar-navigation-menu/

那些连接(segues)应该被标记为“显示视图控制器”并且它们中的每一个都必须相应地命名:“sw_front”和“sw_rear”。

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

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

祝你好运!

【讨论】:

  • 我刚刚更新了我的故事板现在。但错误继续。我和本教程的区别在于,在本教程中,初始控制器是 SWRevealViewController,而在我的情况下,这并不相同。我的应用程序在这一行崩溃:[self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];如何设置 self.revealViewController ?
  • 只要你想打电话给self.revealViewController,你只需要#import "SWRevealViewController.h"。我在看你更新的故事板。您没有将菜单的单元格与它们在点击它们后必须显示的视图连接起来。您需要将每个单元格与一个视图连接,并选择“显示视图控制器”作为 segue。
  • 在显示一些视图之前,我想看看菜单!我试试这个:'if (self.revealViewController) { [_sidebarButton setTarget: self.revealViewController]; [_sidebarButton setAction: @selector(revealToggle: )]; [self.revealViewController panGestureRecognizer]; }' 但应用程序不进入状态,然后当我按下按钮以显示滑出菜单时,什么也没有出现.....
  • 你能更新你的问题,把你的侧边栏代码和视图控制器的代码放在你可以显示侧边栏的地方吗?
  • 如果你上传你的项目就完美了。
猜你喜欢
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多