从数组中显示字符串只需一次,每天更改一次

时间:2012-08-02 18:20:56

标签: iphone string random plist

我正在制作一个引用应用程序,我有我的plist设置,并且plist中的每个字符串都是它自己的引用。我可以在其中一个视图中使用TextView显示引号,并在每天午夜更改它,然后将字符串标记为已使用,以便它不会重复它,并以随机顺序继续执行?

2 个答案:

答案 0 :(得分:1)

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

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

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

Day 1:
  unusedQuotes = [ 0, 1, 2, 3, 4 ];
  randomly choose index 2.
  unusedQuotes[2] is 2 so show quote[2] and remove unusedQuotes[2] from array

Day 2:
  unusedQuotes = [ 0, 1, 3, 4 ];
  randomly choose index 3.
  unusedQuotes[3] is 4 so show quote[4] and remove unusedQuotes[4] from array

Day 3:
  unusedQuotes = [ 0, 1, 3];
  ...
  and so on

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

答案 1 :(得分: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小时。如果有,那么它将为verseKey的键添加1,直到它达到200(我总共有200个引号)。一旦击中了200,它就会将其重置为0.然后我将TextView设置为objectAtIndex:经文的键,以便它会改变。听起来不错?