1

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

我看到视图已创建(蓝色背景颜色),但下次我再次启动应用程序时,我会看到蓝色背景视图。当我将代码放在其他地方时,根本没有蓝色背景的 UIView。谁能帮我解决这个问题,我知道我偏离了轨道。提前致谢。

4

1 回答 1

3

每次都会显示蓝色背景,因为您"firstRun"在视图加载之前将键添加到默认值中,因此在视图加载和[self firstRun]调用时它始终存在。

有几种方法可以解决这个问题。一个很好的解决方案是在应用程序委托中放置一个布尔属性,在applicationDidFinishLaunchingWithObjects:必须设置默认值时将其设置为 true。然后,该firstRun方法将检查委托的属性而不是默认值,以确定这是否是第一次运行。

例子

编辑:该示例现在指的是用户按下接受按钮。参考评论。

在您的 AppDelegate.h 文件中,将以下属性添加到您的界面,在@end.

@property (nonatomic) BOOL firstRun;

在 AppDelegate.m 中applicationDidFinishLaunchingWithObjects,更改您的代码以设置属性。

if (![defaults objectForKey:@"firstRun"]) {
    self.firstRun = YES;
}

当用户按下接受按钮时,在您的视图控制器中设置 firstRun 值。这样,如果应用程序在用户接受之前终止,他们仍然会收到他们必须接受的屏幕。

- (void) acceptTouched {
    ...
    if (![defaults objectForKey:@"firstRun"]) {
        [defaults setObject:[NSDate date] forKey:@"firstRun"];
    }
    ...
}

最后,更改您的firstRun方法以查看属性而不是默认值。

- (void) firstRun {
    if (((AppDelegate*)[UIApplication sharedApplication].delegate).firstRun)
    {
        ...
    }
}

显然,更改AppDelegate以匹配您的应用程序委托类的名称。

于 2013-03-06T17:58:23.990 回答