我正在开发一个报价应用程序,并且我有我的 plist 设置,并且 plist 中的每个字符串都代表它自己的报价。有什么方法可以让我的一个视图中的 TextView 显示一个引号,并在每天午夜更改它,然后将字符串标记为已使用,这样它就不会重复它,并继续以随机顺序进行?
2 回答
NSMutableSet
更新:我之前提到的答案NSMutableArray
可能更符合您的要求。
保留未使用字符串的索引数组(您需要将其持久存储,例如在 中NSUserDefaults
)。您可以在循环中初始化它,并用所有引号的索引填充它。所以如果你有 200 这个数组将有 200 个元素 [0..199]。每天或在适当的时候,从该数组中选择一个随机索引,将其用作当天报价的索引。从数组中删除它并将修改后的数组写回您的NSUserDefaults
. 当数组的元素为零时,将使用所有索引重新填充。签出NSUserDefaults
,NSMutableArray
和arc4random
。
例如,假设您有 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]; ... 等等
您还应该保存选择报价的日期。当用户再次使用您的应用程序时,如果它是同一日期,请不要选择新的报价。如果他们的日子不同,只选择一个新的报价。这样您就不会错过报价或在某一天显示多个报价。
您可以更新您的 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,这样它就会改变。听起来对吗?