2012-08-02 46 views
0

我正在一个报价应用程序,我有我的plist设置和plist中的每个字符串作为自己的报价。有什么方法可以让我的View中的某个TextView显示一个引号,并在每天午夜进行更改,然后将该字符串标记为已用,以便它不会重复,并以随机顺序继续进行?从阵列显示字符串随机,只有一次,并改变每一天

+1

为什么不按顺序显示它们?因为你只会显示每个字符串一次它们在plist中出现的顺序与任何其他顺序一样随机! – idz 2012-08-02 18:23:41

+0

这里有一个不同的@idz,如果它在运行时随机,那么具有不同手机的两个用户将在同一天看到不同的引号。但是,如果它的订购,甚至是随机的,每个用户每天都会看到相同的报价。或者至少按照相同的顺序进行,如果这样做的话,他们必须在报价被使用之前真正查看报价。 – 2012-08-02 18:25:50

+1

@RyanPoolos是的,只要他们都在同一天开始使用应用程序。只是提出一点,一旦你添加一个条件(如不重复)并不像你想象的那样随意!除了评论之外,我也解释了为OP提供一个答案,告诉他们如何去做他们想做的事情! – idz 2012-08-02 18:31:41

回答

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设置为0的值verseKey并将其与同步NSUserDefaults的。然后,每次启动时,它会查看是否超过24小时。如果有,那么它会将1加到verseKey的键上直到它达到200(我总共有200个引号)。一旦命中了200,它就会将它重置为0.然后,我将TextView设置为objectAtIndex:key以便它改变。听起来正确吗?

+0

标记使用的引号的问题在于,如果您有大量的引号,随着您使用它们,随机索引将继续使用已用过的引号,您将不得不迭代。(在最坏的情况下,如果你有大量的报价,只剩下几个选择一些,你可能会等待相当长的一段时间才能登陆一个未使用的;-))。保留一组未使用的指数会更好。那么你总是可以在一次迭代中随机选择一个。如果你真的删除了引号,你仍然需要保留原来的列表,否则你会用完! – idz 2012-08-02 18:38:05

+0

我现在只有200个引号,如果他们不打开每一天,你会提出一个关于缺少引号的好话。现在,每本书都有一个连续几行的报价,我宁愿他们是随机的,所以它没有一周看应用程序,只看到一种特定的报价风格。我可能尝试在加载到xcode之前随机化数组的顺序,然后按顺序进行,但我仍然不确定该怎么说,当应用程序打开时,显示0行,然后等待24小时和显示行1 ... – user717452 2012-08-02 18:46:50

+0

如果你想要它从他们上次打开的应用程序非常容易24小时只需存储一个'NSDate'然后检查启动时使用'timeIntervalSinceDate:'然而,如果你想它是每天的事情,无论他们看什么时间,然后你需要做更复杂的检查。 – 2012-08-02 19:23:01

1

更新:我之前提到的答案NSMutableSet想到NSMutableArray可能是您更好的匹配您的要求。

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

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

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