【问题标题】:Pushing view controller from AppDelegate从 AppDelegate 推送视图控制器
【发布时间】:2015-05-23 12:01:08
【问题描述】:

我刚刚开始学习如何使用 iOS 和 Parse 实现推送通知。 目前,我可以从 Parse 仪表板向应用程序发送推送通知,收到通知,正如我在 Xcode 控制台中看到的那样,但现在我的问题是我无法从 AppDelegate 打开视图控制器。

这是我的代码:

- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))handler {
    // Create empty photo object
    NSString *photoId = [userInfo objectForKey:@"p"];
    NSLog(@"P=%@",photoId);


    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
    Aceptado *targetViewController = (Aceptado*)[mainStoryboard instantiateViewControllerWithIdentifier:@"servicio_aceptado"];
    UINavigationController *controlador = [[UINavigationController alloc]init];
    [controlador pushViewController:targetViewController animated:YES];

    }

正如我所说,控制台显示日志NSLog(@"P=%@",photoId),收到通知,但未显示视图控制器,显示任何警告或错误。

欢迎任何帮助。

【问题讨论】:

  • 您的代码似乎没问题,除了一件事。你从来没有设置rootviewcontroller。如果您想创建导航控制器,则将其设为根视图控制器或在情节提要中使用一个并将其设置为根视图控制器。
  • @MaheshAgrawal,谢谢。但是设置 rootviewcontroller 会抛出异常。
  • 然后您可以在情节提要中添加导航控制器并将其设置为根视图控制器
  • @MaheshAgrawal,但是应用程序的其余部分可能会改变,或者不会?
  • 这取决于您的应用流程。你告诉你正在使用 SWRevealViewController。当您想要导航到其他控制器时,我不知道您的应用程序流程,但是如果您要推送任何控制器,那么您必须需要导航控制器。

标签: ios apple-push-notifications appdelegate


【解决方案1】:

如果您想将视图控制器从 appDelegate 推送到导航堆栈,您需要将您的 rootView 控制器转换为 UINavigation 控制器

【讨论】:

  • 欢迎来到 SO。如果你能用代码解释更多,那会很有帮助。
  • self.window!.rootViewController = UINavigationController(yourRootVC)
【解决方案2】:

我已经这样解决了我的问题:

 UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main"
                                                             bundle: nil];

    Aceptado *controller = (Aceptado*)[mainStoryboard
                                                       instantiateViewControllerWithIdentifier: @"servicio_aceptado"];
        controller.id_not =_id_not;
        controller.idemployee = _idemployee;
        controller.fullname = _fullname;
        controller.phone = _phone;
        controller.photo = _photo;
        controller.dni = _dni;
        controller.licenseplate = _licenseplate;
        controller.model = _model;
        controller.color = _color;
        controller.latitude = _latitude;
        controller.longitude = _longitude;

    self.window.rootViewController = controller;

现在我可以将值从 AppDelegate 文件传递​​给目标视图控制器,同时保持 SWRevealViewController 结构。 感谢大家的提议。

【讨论】:

    【解决方案3】:

    试试这个:

    SomePageViewController *someVC = [self.storyboard instantiateViewControllerWithIdentifier:@"SomeVC"];
    
    self.navController = [[UINavigationController alloc] initWithRootViewController:someVC];
    self.window.rootViewController = self.navController;
    
    [self.window makeKeyAndVisible];
    

    【讨论】:

    • 我已经回答了我自己的问题。无论如何感谢您的帮助。
    【解决方案4】:

    您不应创建新的 NavigationController,而应使用现有的。通常它是您的关键窗口的 rootViewController 属性。

    试试这个:

    UINavigationController *controlador = self.window.rootViewController;
    

    如果您想在 SWRevealViewController 中显示您的 targetViewController,您可以将代码更改为:

    SWRevealViewController *controlador = (SWRevealViewController)self.window.rootViewController;
    [controloador pushFrontViewController:targetViewController animated:YES];
    

    如果您需要在 SWRevealViewController 上显示 targetViewController,请使用:

    WRevealViewController *controlador = (SWRevealViewController)self.window.rootViewController;
    [controloador presentViewController:targetViewController
                     animated:YES
                   completion:nil];
    

    如果您只需将 SWRevealViewController 替换为 targetViewController,请使用:

    self.window.rootviewController=targetViewController;
    

    但不要忘记将 SWRevealViewController 保存在其他属性中。

    【讨论】:

    • 谢谢,我正在使用 SWRevealViewController 并且使用您的建议引发错误:Slider1ViewController pushViewController:animated:]: unrecognized selector sent to instance
    • 我已经回答了我自己的问题。无论如何感谢您的帮助。
    【解决方案5】:

    试试这个。

    UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    Slider1ViewController *viewcontroller = [storyBoard instantiateViewControllerWithIdentifier:@"Slider1ViewController"];
    
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewcontroller];
    [navController setViewControllers: @[viewcontroller] animated: YES];
    
    [self.revealViewController setFrontViewController:navController];
    [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
    

    【讨论】:

    • 谢谢,但我不想打开 Slider1ViewController,我想打开 Aceptado(另一个视图控制器)
    • 然后只需更换视图控制器。
    • 我已经回答了我自己的问题。无论如何感谢您的帮助。
    【解决方案6】:

    试试这个代码。

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
    Aceptado *targetViewController = (Aceptado*)[mainStoryboard instantiateViewControllerWithIdentifier:@"servicio_aceptado"];
    
    UINavigationController *navVc=(UINavigationController *) self.window.rootViewController;
    
    [navVc pushViewController: targetViewController animated:YES];
    

    可以帮到你。

    【讨论】:

    • 谢谢,你的回答和VChemezov一样,抛出异常”:Slider1ViewController pushViewController:animated:]: unrecognized selector sent to instance
    • Slider1ViewController 是 viewController 还是 UINavigationController
    • 我已经回答了我自己的问题。无论如何感谢您的帮助。
    猜你喜欢
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多