首次运行时加载不同的视图

Posted

技术标签:

【中文标题】首次运行时加载不同的视图【英文标题】:Load a different view on first time run 【发布时间】:2013-10-18 14:41:19 【问题描述】:

我正在尝试让我的应用在首次加载时启动不同的视图。 我现在有这段代码,它实现了应用程序首次启动时应该发生的事情。 我有这个代码

  NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  BOOL hasRunBefore = [defaults boolForKey:@"FirstRun"];

  if (!hasRunBefore) 
  [defaults setBool:YES forKey:@"FirstRun"];
   [defaults synchronize];

//这里发生了什么??

else

NSLog (@"Not the first time this controller has been loaded");

所以我应该在 if 语句中启动一个不同的视图控制器。但是我应该放什么呢?

【问题讨论】:

将你的新视图控制器设置为 rootviewcontroller self.window.rootViewController = new view controller “这里有什么?” 但是我应该在 if 语句中添加什么代码? 【参考方案1】:

您并没有真正提供足够的信息来正确回答问题。答案可能取决于:

您在使用情节提要吗? Xib 文件? 全部在代码中?

为了争论,假设您没有使用故事板,并且您以某种方式在应用程序委托中构建了一个视图控制器。

您可以在那里检查您的首次运行状态并按照 Prasad 的建议进行操作: (假设您将第一次运行检查重构为应用委托中的单独方法) ...在 didFinishLaunchingWithOptions 中:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UIViewController* controller;
if([self isFirstRun]) 
   controller = [[MyFirstRunController alloc] init];
 else 
   controller = [[MyStandardController alloc] init];


[[self window] setRootViewController:controller];
[self.window makeKeyAndVisible];

....

这是一种方式。另一种选择是 UIViewController 提供了一个 loadView 方法,专门用于创建控制器的视图。所以另一种方法是在应用程序委托中创建标准视图控制器,然后在控制器 loadView 覆盖中进行第一次运行检查。然后在那里设置适当的视图。

这实际上取决于您的第一个运行视图做什么以及它是否需要自己的控制器或可以由您的标准控制器管理。只有你自己知道。

如果你走后一条路线,你会像这样你的标准控制器:

-(void)loadView 
    UIView *rootView;
    CGRect frame = [[UIScreen mainScreen] bounds];
    if([self isFirstRun]) 
       rootView = [[MyFirstRunView alloc] initWithFrame:frame];
     else 
       rootView = [[MyStandardView alloc] initWithFrame:frame];
    

    [self setView:rootView];

更新

如果从情节提要加载,最好的办法是保持“默认”控制器不变,并在视图加载之前检查您的第一次运行状态,可能在 viewWillAppear 中 - 然后从情节提要手动加载基于情节提要的视图控制器并以模态形式出现。比如:

- (void)presentFirstRunViewController 
    UIStoryboard *storyboard = self.storyboard;
    FirstRunViewController *controller = [storyboard instantiateControllerWithIdentifier:@"FirstRunController"];

   // Configure the new controller

    [self presentViewController:controller animated:YES completion:nil];

一般来说,首选第一种方法(两个控制器),因为它更清晰地分离了职责。但这真的取决于您的需求。

请确认代码 - 在 Windows 机器上输入(相对于从 XCode 粘贴)...

【讨论】:

干杯。我正在使用情节提要,这将如何影响代码 我已经更新了我的答案,并提供了一些关于如何使用情节提要处理此问题的指导 你明白了。非常感谢队友!

以上是关于首次运行时加载不同的视图的主要内容,如果未能解决你的问题,请参考以下文章

应用程序首次运行时加载所有标签栏视图

在第一次运行时加载不同的视图[重复]

Swift Scene Delegate 在首次启动时不运行代码

加载视图后如何在运行时更新 UITableView

首次运行时未显示 Viewcontroller

单击“确定”后首次运行 GPS 未启动