【问题标题】:Work-around for setting defaults before settings.bundle is initialised在 settings.bundle 初始化之前设置默认值的解决方法
【发布时间】:2012-09-10 06:20:37
【问题描述】:

(我是 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,就好像它没有价值一样。因此,我正在测试swimmtypeendurance 的字符串是否既不是ON 也不是OFF,换句话说,如果它不是ON 并且它不是OFF - 因此我尝试使用!和&&...

也许解释我在做什么的更好方法是:我正在从 settings.bundle 测试我的一个设置的值,看看它是打开还是关闭。如果它是两种状态之一,那么我假设设置包已经初始化并且可以使用所有设置,如果不是,即它是无状态的,那么我创建一个要使用的数组,直到用户初始化 settings.bundle。

这是为问题提供上下文的完整的 sn-p 代码:

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]);
    }

我们将不胜感激任何关于此的提示和 cmet,包括我可以根据您的卓越知识和经验对我的编码进行的任何改进。

非常感谢您的帮助...

【问题讨论】:

  • 为什么不使用 NSUserDefaults registerDefaultsSO answer。这样它会比你的 if else isEqualToString 狂欢干净得多
  • 谢谢 - 现在将去阅读 registerDefaults。关于为什么我的 if-else 不起作用的任何想法?

标签: iphone objective-c ios5 settings.bundle


【解决方案1】:

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

首先应该知道boolForKey 将在两种不同的条件下返回 NO:首先是当密钥不存在时(有效地是当用户没有初始化设置包时)以及当它被设置时到关闭位置的编号。这使得使用 boolForKey 进行测试变得非常不可能,但是如果您使用 objectForKey 来测试密钥是否存在,那么它可以完美地工作。代码如下所示(与问题中的示例代码保持一致):

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2023-03-18
    • 1970-01-01
    • 2021-04-18
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多