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

时间:2013-10-18 14:41:20

标签: ios objective-c views

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

  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语句中启动一个不同的视图控制器。但是我该怎么办?

1 个答案:

答案 0 :(得分:4)

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

  • 你在使用故事板吗?
  • Xib文件?
  • 所有代码?

为了争论,假设您没有使用故事板,而且您已经在应用代理中构建了一个视图控制器。

您可以检查您的首次运行状态,并按照Prasad的建议进行操作: (假设您将第一次运行检查重构为app委托中的单独方法) ...在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方法。所以另一种方法是在app delegate中创建标准视图控制器,然后在控制器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粘贴的代码)...