【问题标题】:How to push viewcontroller from appdelegate in storyboard inside navigation controller如何在导航控制器内的故事板中从 appdelegate 推送视图控制器
【发布时间】:2015-11-26 16:20:39
【问题描述】:

我在我的项目中使用 SWRevealViewController,我想在应用收到通知时打开一个特定的控制器。我尝试了很多解决方案,但没有任何效果。

我通过使用故事板来关注这个http://www.appcoda.com/ios-programming-sidebar-navigation-menu/。我的故事板设计如下:

当应用程序收到通知时,我想在其导航控制器中加载照片视图控制器。我在 AppDelegate 中尝试了以下代码:

UIStoryboard *st = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
    photoViewController *descController = (PhotoViewController*)[st instantiateViewControllerWithIdentifier: @"photoView"];
    UINavigationController *frontNavigationController = [[UINavigationController alloc] initWithRootViewController:descController];
    SidebarTableViewController *rearViewController = (SidebarTableViewController*)[st instantiateViewControllerWithIdentifier: @"menuController"];

    SWRevealViewController *mainRevealController = [[SWRevealViewController alloc]  init];

    mainRevealController.rearViewController = rearViewController;
    mainRevealController.frontViewController= frontNavigationController;
    self.window.rootViewController =nil;
    self.window.rootViewController = mainRevealController;
    [self.window makeKeyAndVisible];

这可行,但会创建一个新的导航控制器,我需要使用故事板中已经定义的那个,因为它具有特定的属性。

有什么想法吗?

谢谢

【问题讨论】:

    标签: ios objective-c uiviewcontroller appdelegate swrevealviewcontroller


    【解决方案1】:

    请试试这个,它可能对你有帮助。在此,当您单击通知时,我们首先为 appdelegate 调用此方法

    -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
    {
    UINavigationController *navController = (UINavigationController  *)self.window.rootViewController;
    
    NotificationViewController *notificationViewController = [[NotificationViewController alloc] init];
    
    [navController.visibleViewController.navigationController pushViewController:notificationViewController];    
    
    }
    

    【讨论】:

      【解决方案2】:

      其实SwLRevalViewController已经拥有Root的所有权,所以这样做

      在 Appdelegate.m 中

      //initially navigate to your Main controller on SWL
      
      - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
      {
      
         NSString *alert = userInfo[@"aps"][@"redirect_url"];
      [[NSUserDefaults standardUserDefaults]setObject:alert forKey:@"itemType"];
       [[NSUserDefaults standardUserDefaults]synchronize];
       UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
      SWRevealViewController *main = (SWRevealViewController *)[mainStoryboard instantiateViewControllerWithIdentifier:@"SWRevealViewController"];
      
          self.window.rootViewController = main;
       }
      

      //它会自动重定向到你的根控制器

      在主视图控制器ViewDidLoad 上检查/导航到您的照片视图控制器

              NSString *getType=[[NSUserDefaults standardUserDefaults]objectForKey:@"itemType"];
       if ([gettypeofItem isEqualToString:@"something"])
              {
         yourPhotoViewController *ivc=[self.storyboard instantiateViewControllerWithIdentifier:@"yourPhotoViewController"];
      
         [self.navigationController pushViewController:ivc animated:YES];
          }
        else
      
        {
      
         // do nothing 
      
        }
      

      【讨论】:

      • 好的,我怎样才能以这种方式发送参数?我需要将通知的 id 传递给 pohotoViewController。
      • 使用 nsuserdefault 添加和访问用户默认值时删除用户默认值
      • 太棒了!感谢您的帮助!
      【解决方案3】:

      您可以使用以下方法

      NSString *storyBoardName=@"Main_iPad";
      if (isPhone)
          storyBoardName=@"Main_iPhone";
      UIStoryboard *storyBoard=[UIStoryboard storyboardWithName:storyBoardName bundle:nil];
      
      PlayVideoBySocketsScene *controller=[storyBoard instantiateViewControllerWithIdentifier:@"playVideoUsingSockets"];
      
      
      float disptachTime=2.0;
      if (value)
      {
          disptachTime=1.0;
      }
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(disptachTime * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
          [[[[UIApplication sharedApplication] keyWindow] rootViewController]  presentViewController:controller animated:YES completion:nil];
      

      【讨论】:

      • 感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 2014-01-11
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      相关资源
      最近更新 更多