【发布时间】:2012-02-26 03:52:17
【问题描述】:
Tweetbot 和 Clear 在应用程序的第一次启动时显示一个小的教程屏幕,该应用程序是如何工作的。带有小教程的屏幕仅在应用程序第一次启动时弹出(1次)
我可以如何以及用什么来制作类似的东西?谁能把我推向正确的方向?
查看我的意思:
【问题讨论】:
标签: objective-c ios cocoa-touch
Tweetbot 和 Clear 在应用程序的第一次启动时显示一个小的教程屏幕,该应用程序是如何工作的。带有小教程的屏幕仅在应用程序第一次启动时弹出(1次)
我可以如何以及用什么来制作类似的东西?谁能把我推向正确的方向?
查看我的意思:
【问题讨论】:
标签: objective-c ios cocoa-touch
我假设 Xcode 实际上是指 iOS。
您需要做的是使用NSUserDefaults 类存储一个标志,指示用户之前是否看过教程屏幕。
当您的应用首次加载时(或在您想要决定是否显示教程屏幕时),请执行以下操作:
if(![[NSUserDefaults standardUserDefaults] boolForKey:@"hasSeenTutorial"])
[self displayTutorial];
这会检查为当前用户保存的 NSUserDefaults 中是否存在名为“hasSeenTutorial”的值,该值尚不存在。由于它不存在,它将调用displayTutorial。 displayTutorial 指的是您创建教程视图的方法。你可以弄清楚那部分。
然后,一旦用户关闭教程屏幕:
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"hasSeenTutorial"];
该值将保存在您的用户配置文件中,这意味着下次检查时,它将为真,因此不会调用 displayTutorial。
【讨论】:
synchronize。
在你看来DidLoad:
if (![@"1" isEqualToString:[[NSUserDefaults standardUserDefaults]
objectForKey:@"aValue"]]) {
[[NSUserDefaults standardUserDefaults] setValue:@"1" forKey:@"aValue"];
[[NSUserDefaults standardUserDefaults] synchronize];
//Action here
}
【讨论】:
当然,如果我们想在更新后告诉用户一些有关功能的信息(不仅仅是第一次启动的应用程序),下面的解决方案可能是合适的。
在你看来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 中的应用程序包版本仅在更新后与当前包版本不同,并且仅在首次启动时显示一次。
【讨论】:
使用 BOOL 初始化您的用户默认值,称为 instructionsSeen(或任何您想要的),并在您的 App 委托的初始化方法中将其设置为 NO。在您的应用中,测试此值是否为 @987654323 @ 显示您的教程屏幕。作为显示和显示此屏幕的一部分,将instructionsSeen 设置为YES 并将其存储在您的默认值中。
这样演示屏幕只会在首次启动时显示,除非用户再次卸载并安装应用程序。
您还可以展示少量启动的演示(例如 3 次)。在这种情况下,不要使用BOOL,而是使用数字并递增它。
【讨论】:
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();
}
【讨论】:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (![defaults objectForKey:@"firstRun"]) {
[defaults setObject:[NSDate date] forKey:@"firstRun"];
[self displayTutorial];
}
【讨论】:
斯威夫特版本:
if !(NSUserDefaults.standardUserDefaults().boolForKey("seenTutorial")) {
//Tutorial part
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "seenTutorial")
}
【讨论】:
每个人都在使这个比它需要的更复杂和模糊......简单完整的解决方案。
在 ViewDidLoad 中:
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"FirstLoadKey"]) {
self.imageView.hidden = YES;
}else{
self.imageView.hidden = NO;
[[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"FirstLoadKey"];
[[NSUserDefaults standardUserDefaults]synchronize];
}
【讨论】: