在 appDelegate 中首次展示视图

Posted

技术标签:

【中文标题】在 appDelegate 中首次展示视图【英文标题】:Presenting a view for the first time in appDelegate 【发布时间】:2014-01-06 09:47:03 【问题描述】:

目标:

当我的应用启动时 - 我需要它在它进入“主”屏幕之前显示一个视图。它是一个标签栏应用程序,此视图不是标签栏的一部分。

我正在使用 Storyboards 和 Xcode 5 - 仅限 ios7 的应用程序。

问题:

我有代码可以检查应用程序是否首次启动。在此基础上,我想向用户展示一个仅一次的视图。

我尝试过的:

以下代码位于应用程序的 appDelegate 中,因为这是一切开始的地方。我在那里调用以下代码:

-(void)showCountrySettings


    if (self.termsHaveBeenAccepted)

        BBCounterySettingsViewController *countrySettings = [[BBCounterySettingsViewController alloc]initWithNibName:@"View" bundle:nil];

        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
        UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"IDENTIFIER"];
        [self.navigationController pushViewController:vc animated:YES];

我收到编译错误,因为[self.navigationController..] 不存在。 [self.tabbarcontroller...];也没有

这很明显,因为我没有为这些设置属性 - 但我该如何解决这个问题并将标签栏连接到情节提要?

我错过了什么?

【问题讨论】:

你的 StoryBoard 中有 NavigationController 或 TabBarColler 作为起点吗? TabBarController - 设置为初始视图。 你只是想将一些视图显示为 pop 或者你需要显示一个 viewController。 它只是一个显示 T&C 的 viewController - 它只需要显示一次。模态视图可以在这里工作。 【参考方案1】:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    // Override point for customization after application launch.


    if(!isAgreementAccepted)
    

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"IDD"];
    self.window.rootViewController=vc;
    

    return YES;

如果不接受协议,则在用户单击接受按钮时将 T&C viewController 设置为 rootViewController,然后将 TabBarviewController 设置为 root。

你可以在任何地方通过应用程序委托访问寡妇对象

[[[UIApplication sharedApplication]delegate] window].rootViewController=tabViewController.

【讨论】:

这似乎是最简单的方法。我已经测试过了,它完全按照我的需要做。谢谢!【参考方案2】:

以编程方式更改窗口的rootviewcontroller

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


   UIStoryboard *aStoryBoard=[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
   UITabBarController *aTabCtrl=[aStoryBoard instantiateViewControllerWithIdentifier:@"Tab"];
   FirstVC *aFirstCtrl=[aStoryBoard instantiateViewControllerWithIdentifier:@"First"];

   if(self.termsHaveBeenAccepted)
      self.window.rootViewController=aFirstCtrl;
   else
      self.window.rootViewController=aTabCtrl;
   return YES;

我已经测试过,这肯定会起作用。

【讨论】:

谢谢 - 是的,它确实有效 - 我会记住这段代码。我需要展示另一个屏幕,这段代码将在那里提供帮助。 是的,您可以更改任何屏幕。【参考方案3】:

如果 Tabbarcontroller 是您的根视图控制器,则使用以下代码将解决您的 appdelegate 中的问题。

 -(void)showCountrySettings
  

     if (self.termsHaveBeenAccepted)

    BBCounterySettingsViewController *countrySettings = [[BBCounterySettingsViewController alloc]initWithNibName:@"View" bundle:nil];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"IDENTIFIER"];
    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;

    [tabBarController presentModalviewcontroller:vc animated:YES completionblock:nil];
  

【讨论】:

谢谢 - 但是 [self.tabbarcontroller...];给出错误:“在 BBAppDelegate 类型的对象上找不到属性 tabbarcontroller” UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;顺便说一句,为什么投反对票?给出适当的反对理由,以便每个人都可以学习。 谢谢 - 但是我收到以下消息:2014-01-06 12:12:45.327 BidOrBuy[1168:70b] 警告:尝试在 上呈现 视图不在窗口层次结构中! 您的 rootviewcontroller 似乎没有完全形成。延迟调用该方法。 [self performSelector:@selector(showCountrySettings) withObject:self afterDelay:1.0];.【参考方案4】:

添加您的 tabbarcontroller 的 viewcontroller 超级视图作为第一次单独调用 tabbarcontroller

【讨论】:

以上是关于在 appDelegate 中首次展示视图的主要内容,如果未能解决你的问题,请参考以下文章

PF QueryCollection ViewController 中首次加载时未出现图像

appdelegate 共享实例委托

SwipeActions 按钮和 ToolBar 按钮触发的多个工作表(项目:)在 SwiftUI 中首次获取 nil 对象

Xcode & Swift - 无法从 AppDelegate 实例化另一个视图控制器

向 AppDelegate 添加协议未注册

从 appdelegate 展示一个视图控制器