在初始化settings.bundle之前设置默认值的解决方法

时间:2012-09-10 06:20:38

标签: iphone objective-c ios5 settings.bundle

(我是IOS和Objective-C的新手,所以请原谅任何错误使用的术语......) 在我的应用程序中,我选择使用settings.bundle来存储我的应用程序设置,但是当首次安装应用程序时,在用户导航到其IOS设备上的“设置”之前,它不会加载默认设置。我已阅读了很多帖子,说明应用程序应该创建自己的默认值,直到settings.bundle已经“初始化”。

为此,我编写了一些读入settings.bundle的代码并相应地创建了一个数组。但是如果尚未初始化settings.bundle,则会创建一个在此期间使用的默认数组。我怀疑我的问题是使用以下代码行,我使用逻辑AND运算符(可能不正确...):

if (!([swimtypeendurance isEqualToString:@"ON"]) && !([swimtypeendurance isEqualToString:@"OFF"]))

问题是我无法获得上述if语句的真实结果,我的应用程序总是执行'else'。我对settings.bundle的理解是,如果它们尚未初始化,那么开关既不是ON也不是OFF,就好像它没有值一样。因此我测试看看swimtypeendurance的字符串是不是ON还是OFF,换句话说,如果它不是ON而且它不是OFF - 因此我试图使用!和&& ...

或许更好的方式来扩展我正在做的事情:我正在测试settings.bundle中我的一个设置的值,看它是打开还是关闭。如果它是两个状态之一,那么我假设设置包已经初始化并且可以使用所有设置,如果不是,即它是无状态的,那么我创建一个数组,直到用户初始化settings.bundle。

以下是提供问题背景的完整代码片段:

NSMutableArray* arrayofswimtypes = [NSMutableArray arrayWithCapacity:15];
    NSString *swimtt750 = [defaults boolForKey:kswimtypett750mKey]? @"ON" : @"OFF";
    if ([swimtt750 isEqualToString:@"ON"]) {
        swimTypeTt750m = [[NSString alloc] initWithFormat:@"Time Trial - 750m"];
        [arrayofswimtypes addObject:[[NSString alloc] initWithFormat:@"%@", swimTypeTt750m]];
    }
    NSString *swimtt1500 = [defaults boolForKey:kswimtypett1500mKey]? @"ON" : @"OFF";
    if ([swimtt1500 isEqualToString:@"ON"]) {
        swimTypeTt1500m = [[NSString alloc] initWithFormat:@"Time Trial - 1500m"];
        [arrayofswimtypes addObject:[[NSString alloc] initWithFormat:@"%@", swimTypeTt1500m]];
    }

    [arrayofswimtypes addObject:[[NSString alloc] initWithFormat:@"General Session"]];

    NSString *swimtypedrills = [defaults boolForKey:kswimtypedrillsKey]? @"ON" : @"OFF";
    if ([swimtypedrills isEqualToString:@"ON"]) {
        swimTypeDrills = [[NSString alloc] initWithFormat:@"Drills Session"];
        [arrayofswimtypes addObject:[[NSString alloc] initWithFormat:@"%@", swimTypeDrills]];
    }
    NSString *swimtypeendurance = [defaults boolForKey:kswimtypeenduranceKey]? @"ON" : @"OFF";
    if ([swimtypeendurance isEqualToString:@"ON"]) {
        swimTypeEndurance = [[NSString alloc] initWithFormat:@"Endurance Session"];
        [arrayofswimtypes addObject:[[NSString alloc] initWithFormat:@"%@", swimTypeEndurance]];
    }

    //Place an if-else statement in here to load a default array if the user has not been to settings and initialised the settings.bundle
    if (!([swimtypeendurance isEqualToString:@"ON"]) && !([swimtypeendurance isEqualToString:@"OFF"])) {
        swimSessTypesArray = [[NSMutableArray alloc] initWithObjects:[[NSString alloc] initWithFormat:@"Time Trial - 750m"],
                              [[NSString alloc] initWithFormat:@"Time Trial - 1500m"], 
                              [[NSString alloc] initWithFormat:@"General Session"],
                              [[NSString alloc] initWithFormat:@"Drills Session"],
                              [[NSString alloc] initWithFormat:@"Endurance Session"], nil];
        NSLog(@"Count of swimSessTypesArray NOT FROM Defaults: %i", [swimSessTypesArray count]);
    } else {
        swimSessTypesArray = arrayofswimtypes;
        NSLog(@"Count of swimSessTypesArray from Defaults: %i", [swimSessTypesArray count]);
    }

对此的任何提示和评论都将受到高度赞赏,包括我可以根据您的优越知识和经验对我的编码进行的任何改进。

非常感谢您的协助......

1 个答案:

答案 0 :(得分:0)

好的,马蒂亚斯的评论让我找到了工作的解决方案。基本上有两种常用的方法可以测试用户是否初始化了应用程序的settings.bundle,如果没有,则设置默认值:1)使用registerDefaults和2)使用一些IF-ELSE语句创建自己的测试。由于这个问题与后两个选项有关,我将回答它而不是registerDefaults方法。

应该知道的第一件事是boolForKey将在2个不同的条件下返回NO:首先当密钥不存在时(有效的时候设置包没有被用户初始化)以及何时设置为OFF位置的no。这使得使用boolForKey测试是非常不可能的,但如果你使用objectForKey来测试密钥是否存在,那么它就可以完美地工作。代码看起来像这样(与问题中的示例代码保持一致):

if (![boolForKey:kswimtypeednurancekey]) {
Create your default settings to be used by the app;
} else {
Use the settings from the settings.bundle;
}