iOS首次启动导览 - 检测应用程序是否是第一次启动

5

我对这个网站很陌生,只有业余知识!几周前开始自学。已经有一个非常稳定的iPhone应用程序,但我想添加的最后一个功能是:

创建“仅首次启动”的引导游览。

我想知道的是; 如果是用户的第一次启动应用程序,如何在没有按钮点击的情况下将视图重定向到新的视图控制器,全部通过编程实现。

我已经阅读了一些关于检测首次启动的教程,这些内容我都能够理解。 我也读了一些教程并尝试了书中的所有方法来实现“performSegueWithIdentifier”,但是对我来说什么都没用!

也许是因为我使用的是Xcode 5并在iOS 7上进行测试。 如果有人可以帮助我,我将永远感激不尽!

(void)viewDidLoad
{
    [super viewDidLoad];

    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"FirstLaunch"]) {
    }
    else {
        // Place code here
        self.view.backgroundColor = [UIColor redColor];

        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"FirstLaunch"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }    

    // Do any additional setup after loading the view, typically from a nib.
}

你尝试过什么?也许给我们展示一些代码。你尝试的方法有什么问题?提供的细节越多,我们就越能帮助你。 - neilco
我在我的主贴中添加了我在viewcontroller.m文件中添加的内容。这很好用,但是我不太确定在“//Place code here”部分应该放什么来打开另一个视图控制器。 - Luke
我还尝试通过在上面标有“//place code here”的位置放置以下代码来编程创建一个segue并将其推送:[self performSegueWithIdentifier:@"Tour" sender:self];我的segue名称为“Tour”。 - Luke
你的代码中有没有调用过[[NSUserDefaults standardDefaults] registerDefaults:]这个方法? - neilco
3个回答

6
如果您没有使用[[NSUserDefaults standardDefaults] registerDefaults:]注册任何默认值,第一次调用[[NSUserDefaults standardDefaults] boolForKey:@"FirstLaunch"]时,您将收到NO,因为该键不存在。
我更喜欢使用更语义化的键名,例如hasPerformedFirstLaunch,这样只需要检查是否返回NO并执行第一个启动序列即可:
- (void)viewDidLoad
{
    [super viewDidLoad];

    if (![[NSUserDefaults standardUserDefaults] boolForKey:@"hasPerformedFirstLaunch"]) {
        // On first launch, this block will execute

        // Set the "hasPerformedFirstLaunch" key so this block won't execute again
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"hasPerformedFirstLaunch"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    else {
        // On subsequent launches, this block will execute
    }    

    // Do any additional setup after loading the view, typically from a nib.
}

作为一个相对新手的程序员,能够区分不同的代码对我来说非常有帮助。现在我们已经知道如何识别第一次启动并保存信息了,那么如何通过编程实现到另一个视图控制器的跳转呢?我尝试使用“performseguewithidentifier”,但是什么也没有发生! - Luke
我没有尝试过,因为我不怎么使用 storyboards,但是你可能在 viewWillAppear: 中进行第一次启动检查并执行 segue 会更加顺利。performSegueWithIdentifier: 应该可以工作。 - neilco
我已经尝试在viewWillAppear和viewDidLoad中使用它,但什么也没有发生。它不会触发任何东西! - Luke
现在使用您上面发布的代码可以正常工作,但是在调试面板中我收到了以下消息:2013-10-20 18:14:23.549 Rawr![66306:a0b] Unbalanced calls to begin/end appearance transitions for <UINavigationController: 0xa45a700>.这个消息有什么需要担心的吗? - Luke
使用 dispatch_after 将转场延迟几百毫秒,以便 viewDidLoad 中的任何挂起操作都有时间完成。 - neilco
显示剩余2条评论

1

neilco

您提供的代码确实有效,但您遗漏了在APP首次启动时将屏幕变为红色(或其他颜色)的代码。

现在这可能看起来不太重要,但当新手尝试时,最好提供尽可能多的信息,以便我们甚至可以理解正在发生什么。是的,这包括我!!<<= 新手

  - (void)viewDidLoad
{
    [super viewDidLoad];

    if (![[NSUserDefaults standardUserDefaults] boolForKey:@"hasPerformedFirstLaunch"]) {
        // On first launch, this block will execute
        // Place code here
        self.view.backgroundColor = [UIColor redColor];

        // Set the "hasPerformedFirstLaunch" key so this block won't execute again
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"hasPerformedFirstLaunch"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    else {
        // On subsequent launches, this block will execute
    }

    // Do any additional setup after loading the view, typically from a nib.
}

1
这是一个Guided tour的资源https://github.com/sofienazzouz/Guided-Tour,现在如果你想从代理中调用Guided tour,你应该像这样调用它。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//// initialize your initialViewController here however you want
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"knewOrRecentUser"]) {
        self.navigationController = [[UINavigationController alloc] initWithRootViewController:self.initialViewController];
   } else {
       [[NSUserDefaults standardUserDefaults] setObject:@"old" forKey:@"knewOrRecentUser"];
       GuidedTourViewController *guideTour = [[GuidedTourViewController alloc] init];
       self.navigationController = [[UINavigationController alloc] initWithRootViewController:guideTour];
   }
[self.window setRootViewController:self.navigationController];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接