【问题标题】:How do you change the initial view controller in an ios application based on a remote notification?如何根据远程通知更改 ios 应用程序中的初始视图控制器?
【发布时间】:2013-04-03 00:59:02
【问题描述】:

我有一个实现远程通知的应用程序。我的愿望是根据以下三个条件之一更改初始视图控制器:用户自己启动应用程序(无通知);或者,用户收到可疑活动警报;或者,用户收到犯罪警报。我已经在 appDelegate 中实现了应用程序 didReceiveRemoteNotification: 方法。根据通知和用户对通知的响应,我实现了以下代码:

UITabBarController *tbContr = (UITabBarController*) self.window.rootViewController;
UINavigationController *navContr = [tbContr.viewControllers][2];
ViewCrimesController *viewCrimes = [navContr.storyboard instantiateViewControllerWithIdentifier:@"ViewCrimes"];
[navContr presentViewController:viewCrimes animated:YES completion:nil];

[self.window.makeKeyAndVisible];

我遇到的问题是导航控件——即后退按钮和导航栏标题;出现时不在 ViewCrimesController 上。我尝试以多种不同的方式加载 ViewCrimesController。每种方式我都得到错误,说没有 segue(这个视图是映射视图的模型视图),或者我正在尝试加载活动视图,或者再次,我没有获得导航控件。

我是否需要专门对导航控件进行编程,还是在尝试加载视图时遗漏了什么?

我在其他帖子中看到了对动态更改初始视图的引用。但我没有看到任何表明添加控件需要特定编程的东西。非常感谢您提供的任何帮助!

苏珊

【问题讨论】:

  • 您可能会在此代码上看到警告,您可以在没有强制转换的情况下访问 viewControllers。另外,你能更好地描述你想要发生的事情吗?例如形式:'我有 N 个选项卡,每个选项卡都是一个导航控制器。当某些通知条件发生时,我希望 X 成为可见的第一件事。
  • 你能详细说明这个“我遇到的问题是导航控件——即后退按钮和导航栏标题;当它出现时不在 ViewCrimesController 上”
  • 您要求ViewCrimes 控制器 - 大概在您的记分牌中,它嵌入在导航控制器中。当您直接实例化 ViewCrimes 控制器时,您没有得到包装 UINavigationController
  • @Paul.s,谢谢。你的评论让我走上了正轨。最终我所做的是删除 ViewCrimes 控制器的实例化,而是使用嵌入式 ViewCrimes 控制器从情节提要中实例化第二个导航控制器。因此,我删除了 'ViewCrimesController *viewCrimes'... 并将其替换为 'UINavigationController *nv = [navContr.storyboard instantiateViewControllerWithIdentifier:@"navcrimes";'

标签: iphone cocoa-touch uinavigationcontroller apple-push-notifications


【解决方案1】:

你看过帖子吗,Programmatically set the initial view controller using Storyboards

该帖子的答案可能会解决您的问题,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

    UIViewController *viewController = // determine the initial view controller here and instantiate it with [storyboard instantiateViewControllerWithIdentifier:<storyboard id>];

   self.window.rootViewController = viewController;
   [self.window makeKeyAndVisible];

   return YES;
}

您也可以download此示例,并根据您的要求实现它。

【讨论】:

    【解决方案2】:

    只需要修改key window的rootViewController,示例代码放在这里,希望对你有帮助:

    UIStoryboard *storyboard = self.window.rootViewController.storyboard;
        UIViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"rootNavigationController"];
        self.window.rootViewController = rootViewController;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      相关资源
      最近更新 更多