我敢肯定,它告诉我更多关于我的 Objective-c 但我对第一次运行检查感到困惑。我已经阅读了几个关于这个主题的问答,但我无法让它正常工作。
情况是这样的:
在 applicationDidFinishLaunchingWitObjects 的 appDelegate.m 文件中,我添加了该方法
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (![defaults objectForKey:@"firstRun"])
[defaults setObject:[NSDate date] forKey:@"firstRun"];
[[NSUserDefaults standardUserDefaults] synchronize];
在我的 mainViewController.m 中,我添加了
-(void) firstRun
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if([defaults objectForKey:@"firstRun"])
{
CGRect myFrame = CGRectMake(0, 0, 320, 460);
UIView *myView = [[UIView alloc] initWithFrame:myFrame];
myView.backgroundColor = [UIColor blueColor];
[self.view addSubview:myView];
}
}
最后在我的 viewDidLoad 中(在 mainViewcontroller.m 文件中):
[self firstRun];
我看到 View 已创建(蓝色背景颜色),但下次我再次启动应用程序时,我会看到蓝色背景 View 。当我将代码放在其他地方时,根本没有蓝色背景的 UIView。谁能帮我解决这个问题,我知道我偏离了轨道。提前致谢。
最佳答案
每次都会显示蓝色背景,因为您要添加 "firstRun"
在 View 加载之前键入默认值,因此在 View 加载和 [self firstRun]
时它始终存在叫做。
有几种方法可以解决这个问题。一个很好的解决方案是在应用程序委托(delegate)中放置一个 bool 属性,您在 applicationDidFinishLaunchingWithObjects:
期间设置为真。当必须设置默认值时。 firstRun
然后方法将检查委托(delegate)的属性而不是默认值,以确定这是否是第一次运行。
例子
编辑:该示例现在指的是用户按下“接受”按钮。引用评论。
在您的 AppDelegate.h 文件中,将以下属性添加到您的界面,在 @end
之前.
@property (nonatomic) BOOL firstRun;
在 AppDelegate.m 中,在
applicationDidFinishLaunchingWithObjects
中,更改您的代码以设置属性。if (![defaults objectForKey:@"firstRun"]) {
self.firstRun = YES;
}
当用户按下接受按钮时,在您的 View Controller 中设置 firstRun 值。这样,如果应用程序在用户接受之前终止,他们仍然会收到他们必须接受的屏幕。
- (void) acceptTouched {
...
if (![defaults objectForKey:@"firstRun"]) {
[defaults setObject:[NSDate date] forKey:@"firstRun"];
}
...
}
最后,更改您的
firstRun
方法来查看属性而不是默认值。- (void) firstRun {
if (((AppDelegate*)[UIApplication sharedApplication].delegate).firstRun)
{
...
}
}
显然,更改
AppDelegate
以匹配您的应用委托(delegate)类的名称。
关于ios - App first Run 和 NSUserDefaults,它让我眼花缭乱。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15254460/