0

I'm trying to make my app launch a different view on the first time it is loaded up. I've got this code at the moment which implements that something should happen when the app is first launched. I've got this code

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

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

// what goes here??

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

So I should launch a different view controller in the if statement. But what should I put ?

4

1 回答 1

4

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

  • 你在使用故事板吗?
  • 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 粘贴)...

于 2013-10-18T20:17:34.230 回答