代码之家  ›  专栏  ›  技术社区  ›  user717452

随机显示数组中的字符串,仅显示一次,并每天更改

  •  0
  • user717452  · 技术社区  · 13 年前

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

    2 回复  |  直到 13 年前
        1
  •  1
  •   user717452    13 年前

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

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

    从操作编辑:
    在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:verses的键,这样它就会更改。听起来不错吧?

        2
  •  1
  •   idz    13 年前

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

    保留的索引数组 未使用的 字符串(您需要将其持久存储,例如 NSUserDefaults )。您可以在一个循环中初始化它,用所有引号的索引填充它。因此,如果你有200个,这个数组将有200个元素[0.199]。每天,或者在适当的时候,从这个数组中选择一个随机索引,将其用作当天报价的索引。将其从数组中删除,并将修改后的数组写回您的 NSUser默认值 。当数组具有零个元素时,使用所有索引重新填充。退房 NSUser默认值 , NS可变阵列 arc4random

    例如,假设你有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
    

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