如何让 UIAlertView 在 iPhone 应用程序第一次启动时只出现一次?
Posted
技术标签:
【中文标题】如何让 UIAlertView 在 iPhone 应用程序第一次启动时只出现一次?【英文标题】:How do I make a UIAlertView appear only once, at the first start-up of an iPhone app? 【发布时间】:2010-04-05 14:16:49 【问题描述】:我正在使用UIAlertView
在应用启动后弹出一个弹出窗口。它工作正常,但我只希望弹出窗口出现在应用程序的第一次启动时。目前我在AppDelegate
类中得到了UIAlertView
,在applicationDidFinishLaunching
方法中。这是我的代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
sleep(4);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Welcome!" message:@"SAMPLE!!!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
我是应用程序开发的新手,如果这很简单,很抱歉。
【问题讨论】:
【参考方案1】:要确定应用程序是否第一次运行,您需要有一个持久变量来存储此信息。 NSUserDefaults 是存储这些简单配置值的最佳方式。
例如,
-(BOOL)application:(UIApplication *)application …
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
if (! [defaults boolForKey:@"notFirstRun"])
// display alert...
[defaults setBool:YES forKey:@"notFirstRun"];
// rest of initialization ...
这里,[defaults boolForKey:@"notFirstRun"]
从配置中读取一个名为 notFirstRun
的布尔值。这些值被初始化为 NO。所以如果这个值为 NO,我们执行if
分支并显示警报。
完成后,我们使用[defaults setBool:YES forKey:@"notFirstRun"]
将此布尔值更改为YES,因此if
分支将永远不会再次执行(假设用户没有删除应用程序)。
【讨论】:
【参考方案2】:- (void) displayWelcomeScreen
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *alreadyRun = @"already-run";
if ([prefs boolForKey:alreadyRun])
return;
[prefs setBool:YES forKey:alreadyRun];
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"…"
message:@"…"
delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
[alert show];
[alert release];
【讨论】:
【参考方案3】:使用最初设置为 0 的 NSUserDefault,您在第一次显示警报后设置为 1。
//default value is 0
[settings registerDefaults:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:@"HAVE_SHOWN_REMINDER"]];
BOOL haveShownReminder = [settings boolForKey:@"HAVE_SHOWN_REMINDER"];
if (!haveShownReminder)
//show your alert
//set it to 1
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:1] forKey:@"HAVE_SHOWN_REMINDER"];
【讨论】:
registerDefaults:
不是多余的吗?【参考方案4】:
简单的3行
-(BOOL)application:(UIApplication *)applicationBlahBlah
if(![[[NSUserDefaults standardUserDefaults] objectForKey:@"NOT_FIRST_TIME"] boolValue])
[[[[UIAlertView alloc] initWithTitle:nil message:@"message" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] autorelease] show];
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"NOT_FIRST_TIME"];
[[NSUserDefaults standardUserDefaults] synchronize];
【讨论】:
这样做没有问题,但是你可以直接使用bool来设置flag。 更容易意识到我正在使用 NSNumber 对象。不是一些布尔值【参考方案5】:由于上述解决方案在大多数情况下都应该有效,所以我想在这个时间点让您了解以下内容。
Apple 文档说:NSUserDefaults 类目前不支持每个主机的首选项。为此,您必须使用 CFPreferences API。参考NSUserDefaults
还有关于这个here的讨论
【讨论】:
以上是关于如何让 UIAlertView 在 iPhone 应用程序第一次启动时只出现一次?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UIAlertView iPhone 中添加 TextView 320*460
如何在 iPhone 应用程序的不同文件中为 UIAlertview 设置委托