ios - App first Run 和 NSUserDefaults,它让我眼花缭乱。

标签 ios objective-c uiview nsuserdefaults

我敢肯定,它告诉我更多关于我的 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/

相关文章:

ios - 当格式说明符错误地传递给方法时如何发出警告

iOS 以编程方式创建 View

ios - 为什么 Social.localUser.Authenticate 在 Unity 应用程序没有互联网连接时会导致崩溃?

ios - 限制圆圈内的运动

ios - JSONDecoder 找不到存在的 key

ios - 如何在另一个 View iOS 上垂直翻转 View ?

ios - 在 UIView 顶部添加减法掩码

ios - 什么时候必须在 iOS AutoLayout 中使用优先级?

ios - 在 Game Center 中正确响应远程玩家退出

objective-c - 内联函数 "undefined symbols"错误