0

我正在开发一个报价应用程序,并且我有我的 plist 设置,并且 plist 中的每个字符串都代表它自己的报价。有什么方法可以让我的一个视图中的 TextView 显示一个引号,并在每天午夜更改它,然后将字符串标记为已使用,这样它就不会重复它,并继续以随机顺序进行?

4

2 回答 2

1

NSMutableSet更新:我之前提到的答案NSMutableArray可能更符合您的要求。

保留未使用字符串的索引数组(您需要将其持久存储,例如在 中NSUserDefaults)。您可以在循环中初始化它,并用所有引号的索引填充它。所以如果你有 200 这个数组将有 200 个元素 [0..199]。每天或在适当的时候,从该数组中选择一个随机索引,将其用作当天报价的索引。从数组中删除它并将修改后的数组写回您的NSUserDefaults. 当数组的元素为零时,将使用所有索引重新填充。签出NSUserDefaultsNSMutableArrayarc4random

例如,假设您有 5 个引号。

第 1 天:
  未使用的报价 = [ 0, 1, 2, 3, 4 ];
  随机选择索引 2。
  usedQuotes[2] 是 2 所以显示 quote[2] 并从数组中删除 usedQuotes[2]

第 2 天:
  未使用的报价 = [ 0, 1, 3, 4 ];
  随机选择索引 3。
  usedQuotes[3] 是 4 所以显示 quote[4] 并从数组中删除 usedQuotes[4]

第 3 天:
  未使用的报价 = [ 0, 1, 3];
  ...
  等等

您还应该保存选择报价的日期。当用户再次使用您的应用程序时,如果它是同一日期,请不要选择新的报价。如果他们的日子不同,只选择一个新的报价。这样您就不会错过报价或在某一天显示多个报价。

于 2012-08-02T18:27:49.200 回答
1

您可以更新您的 plist 以删除引号或设置已使用的标志,然后将其排除在选择之外。

至于何时将其标记为已使用。我不确定每天午夜是否适用于您的模型如果它真的是随机的,那么将它们标记为在午夜使用并没有多大意义,因为他们可能不会每天都打开应用程序并且会错过随机报价。就好像它被订购一样,每天都会有一个报价。

从 OP 编辑​​:
在 AppDelegate didFinishLaunch 我添加了以下代码:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

if (! [defaults boolForKey:@"notFirstRun"]) {

    [defaults setBool:YES forKey:@"notFirstRun"];

    [defaults setInteger:0 forKey:@"verseKey"];
    [defaults synchronize];
}
NSTimeInterval date = [defaults doubleForKey:@"startTimeInterval"];

NSTimeInterval dateNow = [NSDate timeIntervalSinceReferenceDate];

NSTimeInterval difference = dateNow - date;

difference = difference / 84000;

if(difference >= 0 && difference <= 1) {

}   

if(difference >= 1 ) {
    NSLog(@"ITSMORE");
    NSInteger savedIndex = [[NSUserDefaults standardUserDefaults] integerForKey:@"verseKey"];
    savedIndex +=1;
    if (savedIndex == 200) {
        [defaults setInteger:0 forKey:@"verseKey"];
        dateNow = [NSDate timeIntervalSinceReferenceDate];
        [defaults setDouble:dateNow forKey:@"startTimeInterval"];
        [defaults synchronize];
    }
    else {
    [defaults setInteger:savedIndex forKey:@"verseKey"];
    dateNow = [NSDate timeIntervalSinceReferenceDate];
    [defaults setDouble:dateNow forKey:@"startTimeInterval"];
    [defaults synchronize];
    }
}   

我相信这段代码应该在 firstRun 上将 verseKey 的值设置为 0 并将其与 NSUserDefaults 同步。然后,每次启动时,都会查看是否超过 24 小时。如果有,那么它会将 1 加到 verseKey 的键上,直到达到 200(我总共有 200 个引号)。一旦 200 被击中,它将重置为 0。然后我将 TextView 设置为 objectAtIndex:key for verses,这样它就会改变。听起来对吗?

于 2012-08-02T18:28:44.863 回答