使用 SWRevealViewController 时应用程序崩溃

Posted

技术标签:

【中文标题】使用 SWRevealViewController 时应用程序崩溃【英文标题】:App is crashing while using SWRevealViewController 【发布时间】:2017-06-26 08:05:02 【问题描述】:

我将 SWRevealViewController 用于 Slide Out Menu 的应用程序,其中 滑出菜单仅从主屏幕开始 在注册页面中按下注册按钮后(即第一次运行应用程序)。

当应用程序第二次运行时,它应该直接进入主屏幕,但应用程序正在崩溃,并且我在 ViewController 中得到崩溃日志。

_barBtnMenu.target = self.revealViewController;
    _barBtnMenu.action = @selector(revealToggle:);
    [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];

NSInvalidArgumentException',原因:'-[__NSArrayM insertObject:atIndex:]: 对象不能为 nil。

对于应用程序的第一次运行,我使用“注册”按钮中的 Present Modally Segue

SWRevealViewController

- (SWRevealViewController*)revealViewController

    UIViewController *parent = self;
    Class revealClass = [SWRevealViewController class];
    while ( nil != (parent = [parent parentViewController]) && ![parent isKindOfClass:revealClass] ) 
    return (id)parent;

第一次运行时 parent 正在返回一个值,但第二次运行它返回 nil

如果有人可以帮助我解决问题。 提前致谢。

编辑

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

    NSString *savedValue = [[NSUserDefaults standardUserDefaults]
                            stringForKey:@"email"];
    if (savedValue != nil) 

        UIStoryboard *storyboard = self.window.rootViewController.storyboard;
        ViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"viewController"];
        self.window.rootViewController =viewController;
        [self.window makeKeyAndVisible];
     else 
        NSLog(@"Sign Up screen opened");
    
    return YES;

【问题讨论】:

请分享您的源代码。 你是如何实例化 SWRevealViewController 的?来自情节提要还是来自您的代码? 我的解决方法不同,但感谢您的回复.. 你的方法应该可行,但不是理想的解决方案。 【参考方案1】:

您正在尝试在您的应用中实现自动登录功能

对于第二次启动,您必须在 Appdelegate 中维护用户是否已登录的标志,如果用户已经登录,您必须从应用委托中的 didfinishlaunchingwithoptions 函数移动到 SWRevealview 的父控制器。

在登录和注册时将用户名和密码保存到用户默认值

检查 didfinishlaunchingwithoptions 中的值

如果值存在,则移动到 SWrevealview 的父级

【讨论】:

这里 ViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"viewController"]; self.window.rootViewController =viewController;这应该是 swrevealviewcontroller 的父级。【参考方案2】:

感谢您的回复,

我通过将注册页面设置为根视图解决了这个问题

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    NSString *savedValue = [[NSUserDefaults standardUserDefaults]
                            stringForKey:@"email"];
    if (savedValue == nil) 
         UIStoryboard *storyboard = self.window.rootViewController.storyboard;
          SignUpViewController *signUpViewController = [storyboard instantiateViewControllerWithIdentifier:@"signUpViewController"];
        self.window.rootViewController = signUpViewController;
        [self.window makeKeyAndVisible];
     else 
        NSLog(@"Sign Up screen closed,Hom page opened");
    
    return YES;

【讨论】:

以上是关于使用 SWRevealViewController 时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用相同 SWRevealViewController 的不同 ViewController 上的侧边栏

右侧使用 SWRevealViewController 的两个面板

使用 SWRevealViewController 时应用程序崩溃

带有 SWRevealViewController 的 ios 滑动状态栏

如何使用 swrevealviewcontroller 打开菜单启动应用程序?

UINavigationController:使用 SWRevealViewController 错误:不平衡调用开始/结束外观转换