【问题标题】:Show screen on first launch only in iOS仅在 iOS 中首次启动时显示屏幕
【发布时间】:2012-02-26 03:52:17
【问题描述】:

Tweetbot 和 Clear 在应用程序的第一次启动时显示一个小的教程屏幕,该应用程序是如何工作的。带有小教程的屏幕仅在应用程序第一次启动时弹出(1次)

我可以如何以及用什么来制作类似的东西?谁能把我推向正确的方向?

查看我的意思:

【问题讨论】:

    标签: objective-c ios cocoa-touch


    【解决方案1】:

    我假设 Xcode 实际上是指 iOS。

    您需要做的是使用NSUserDefaults 类存储一个标志,指示用户之前是否看过教程屏幕。

    当您的应用首次加载时(或在您想要决定是否显示教程屏幕时),请执行以下操作:

    if(![[NSUserDefaults standardUserDefaults] boolForKey:@"hasSeenTutorial"])
        [self displayTutorial];
    

    这会检查为当前用户保存的 NSUserDefaults 中是否存在名为“hasSeenTutorial”的值,该值尚不存在。由于它不存在,它将调用displayTutorialdisplayTutorial 指的是您创建教程视图的方法。你可以弄清楚那部分。

    然后,一旦用户关闭教程屏幕:

    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"hasSeenTutorial"];
    

    该值将保存在您的用户配置文件中,这意味着下次检查时,它将为真,因此不会调用 displayTutorial

    【讨论】:

    • 你也忘了synchronize
    • 如果您查看文档,“此方法会定期自动调用”,因此除非程序即将退出或有其他禁止调用的现象,否则不需要此方法
    【解决方案2】:

    在你看来DidLoad:

    if (![@"1" isEqualToString:[[NSUserDefaults standardUserDefaults]
                                    objectForKey:@"aValue"]]) {
        [[NSUserDefaults standardUserDefaults] setValue:@"1" forKey:@"aValue"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    
        //Action here
    
    }
    

    【讨论】:

    • 我不明白您的意思:“1”代表您希望看到该动作的次数。您只是在设置一个字符串,如果将其更改为任何字符串,包括 2、3 等,它仍然只会触发一次。
    • 在 iOS 9 上仍然可以完美运行。在我的情况下,我将它用于我的启动画面。我的麻烦是,我在启动画面和主导航中使用相同的视图,在点击我的左侧菜单视图时,它会再次显示我的启动画面。通过放置 [[NSUserDefaults standardUserDefaults] setValue:@"" forKey:@"aValue"]; 解决了这个问题在我的 didFinishLaunchingWithOptions 中。所以它在应用程序启动时重置。谢谢你。
    【解决方案3】:

    当然,如果我们想在更新后告诉用户一些有关功能的信息(不仅仅是第一次启动的应用程序),下面的解决方案可能是合适的。

    在你看来DidLoad:

    NSString *currentBundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
    NSString *previousBundleVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"PreviousBundleVersion"];
    
    if (![currentBundleVersion isEqualToString:previousBundleVersion] ) {
         // Here you can initialize your introduction view and present it!
    }
    

    一旦用户关闭介绍:

    NSString *currentBundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];    
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
    
    if (standardUserDefaults) {
        [standardUserDefaults setObject:currentBundleVersion forKey:@"PreviousBundleVersion"];
        [standardUserDefaults synchronize];
    }
    

    在这种情况下,存储在您的 standardUserDefaults 中的应用程序包版本仅在更新后与当前包版本不同,并且仅在首次启动时显示一次。

    【讨论】:

      【解决方案4】:

      使用 BOOL 初始化您的用户默认值,称为 instructionsSeen(或任何您想要的),并在您的 App 委托的初始化方法中将其设置为 NO。在您的应用中,测试此值是否为 @987654323 @ 显示您的教程屏幕。作为显示和显示此屏幕的一部分,将instructionsSeen 设置为YES 并将其存储在您的默认值中。

      这样演示屏幕只会在首次启动时显示,除非用户再次卸载并安装应用程序。

      您还可以展示少量启动的演示(例如 3 次)。在这种情况下,不要使用BOOL,而是使用数字并递增它。

      【讨论】:

        【解决方案5】:

        AppDelegate 中的 Xamarin.iOS 版本:

        UIStoryboard storyboard = UIStoryboard.FromName("Main", null);
        
                if (NSUserDefaults.StandardUserDefaults.BoolForKey ("hasSeenTutorial") == false) {
                    UIViewController vc = storyboard.InstantiateViewController ("StartPageViewController");
                    this.Window.RootViewController = vc;
        
                } else {
                    UIViewController vc = storyboard.InstantiateViewController ("NonStartPageViewController");
                    this.Window.RootViewController = vc;
        
                }
        
                this.Window.MakeKeyAndVisible ();
        

        在我的 StartPageViewController 中,我有一个将 NSUserDefaults 设置为 true 的按钮,因此下次运行时,它将从 NonStartPageViewController 开始:

        partial void RegisterButton_TouchUpInside (UIButton sender)
            {
                NSUserDefaults.StandardUserDefaults.SetBool(true,"hasSeenTutorial");
                NSUserDefaults.StandardUserDefaults.Synchronize();
            }
        

        【讨论】:

        • 很好,但是您将在 AppDelegate 中检查“hasSeenTutorial”的代码放在哪里?我根本不手动实例化故事板,它是根据项目设置为我完成的。
        • 好吧,没关系。我将其放入 FinishedLaunching() 方法中,并在项目设置中将“主界面”置空。
        【解决方案6】:
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        if (![defaults objectForKey:@"firstRun"]) {
            [defaults setObject:[NSDate date] forKey:@"firstRun"];
            [self displayTutorial];
        }
        

        【讨论】:

        • @ChrisLoonam 我修改了在 NSUserDefaults 中保存状态的代码。
        【解决方案7】:

        斯威夫特版本:

        if !(NSUserDefaults.standardUserDefaults().boolForKey("seenTutorial")) {
                    //Tutorial part
                    NSUserDefaults.standardUserDefaults().setBool(true, forKey: "seenTutorial")
                }
        

        【讨论】:

          【解决方案8】:

          每个人都在使这个比它需要的更复杂和模糊......简单完整的解决方案。

          在 ViewDidLoad 中:

          if ([[NSUserDefaults standardUserDefaults] boolForKey:@"FirstLoadKey"]) {
              self.imageView.hidden = YES;
          }else{
              self.imageView.hidden = NO;
              [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"FirstLoadKey"];
              [[NSUserDefaults standardUserDefaults]synchronize];
          }
          

          【讨论】:

          • 这不是一个图像视图...看到屏幕底部有一个 ViewPager ☻☻☻☻。
          猜你喜欢
          • 2021-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多