Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 随机显示数组中的字符串,仅显示一次,并每天更改_Iphone_String_Random_Plist - Fatal编程技术网

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

Iphone 随机显示数组中的字符串,仅显示一次,并每天更改,iphone,string,random,plist,Iphone,String,Random,Plist,我正在开发一个quote应用程序,我有我的plist设置,plist中的每个字符串都作为自己的quote。有什么方法可以让TextView在我的一个视图中显示一个引号,并在每天午夜更改它,然后将字符串标记为已使用,这样它就不会重复它,并继续以随机顺序进行吗?更新:我之前的回答提到的NSMutableSet考虑NSMutableArray可能更符合您的要求 保留一个未使用字符串的索引数组(您需要将其持久存储,例如在NSUserDefaults中)。您可以在一个循环中初始化它,用所有引号的索引填充它

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

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

保留一个未使用字符串的索引数组(您需要将其持久存储,例如在
NSUserDefaults
中)。您可以在一个循环中初始化它,用所有引号的索引填充它。如果有200个元素,这个数组将有200个元素[0..199]。每天,或在适当的时候,从该数组中选择一个随机索引,将其用作当天报价的索引。将其从数组中删除,并将修改后的数组写回您的
NSUserDefaults
。当数组有零个元素时,用所有索引重新填充。查看
nsserdefaults
NSMutableArray
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 第1天: unusedQuotes=[0,1,2,3,4]; 随机选择指标2。 unusedQuotes[2]是2,所以显示quote[2]并从数组中删除unusedQuotes[2] 第2天: unusedQuotes=[0,1,3,4]; 随机选择指标3。 unusedQuotes[3]是4,所以显示quote[4]并从数组中删除unusedQuotes[4] 第3天: unusedQuotes=[0,1,3]; ... 等等
您还应该保存选择报价的日期。当用户再次使用您的应用程序时,如果是同一日期,请不要选择新报价。仅当日期不同时才选择新报价。这样,您就不会错过报价或在给定日期显示多个报价。

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

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

从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];
    }
}   
NSUserDefaults*默认值=[NSUserDefaults standardUserDefaults];
如果(![默认布尔工作:@“notFirstRun”]){
[默认设置setBool:YES forKey:@“notFirstRun”];
[默认值setInteger:0 forKey:@“verseKey”];
[默认同步];
}
NSTimeInterval日期=[默认值doubleForKey:@“startTimeInterval”];
NSTimeInterval dateNow=[NSDate timeIntervalSinceReferenceDate];
NSTimeInterval差=dateNow-日期;
差异=差异/84000;
如果(差异>=0&&差异=1){
NSLog(@“ITSMORE”);
NSInteger savedIndex=[[NSUserDefaults standardUserDefaults]integerWorkey:@“verseKey”];
savedIndex+=1;
如果(savedIndex==200){
[默认值setInteger:0 forKey:@“verseKey”];
dateNow=[NSDate TimeIntervalnceReferenceDate];
[默认值setDouble:dateNow forKey:@“startTimeInterval”];
[默认同步];
}
否则{
[默认值setInteger:savedIndex-forKey:@“verseKey”];
dateNow=[NSDate TimeIntervalnceReferenceDate];
[默认值setDouble:dateNow forKey:@“startTimeInterval”];
[默认同步];
}
}   

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

为什么不按顺序显示它们呢。。。因为每个字符串只显示一次,所以它们在plist中出现的顺序与任何其他顺序一样随机!有一个不同的@idz,如果它在运行时是随机的,那么两个使用不同手机的用户在同一天会看到不同的报价。然而,如果它是随机订购的,每个用户每天都会看到相同的报价。或者至少按照相同的顺序,如果他们在使用前必须实际查看报价。@RyanPoolos是的,前提是他们在同一天开始使用该应用程序。只是强调了一点,一旦你添加了一个条件(比如不重复),它并不像你想象的那么随机!除了评论之外,我也解释了,并向OP提供了一个答案,建议他们如何做他们想要做的事情!标记用过的引号的问题是,假设你有大量的引号,当你用完它们时,你的随机索引将继续命中用过的引号,你将不得不迭代。(在最坏的情况下,如果你有大量的报价,只剩下很少的报价供你选择,那么你可能要等很长时间才能找到一个未使用的报价;-)。保留一组未使用的索引要好得多;然后,您总是可以在单个迭代中随机选择一个。如果你真的删除了引号,你还需要保留原来的列表,否则你会用完的!我现在只有200个报价,你可以提出一个很好的观点,如果他们没有每天打开报价的话,他们会丢失报价。引用现在是按顺序排列的,每本书都有几行引用,我希望它们是随机的,所以这不是一个看应用程序的一周,只看到一种特定风格的引用。在加载到xcode之前,我可能会尝试自己随机排列数组的顺序,然后让它按顺序进行,但我仍然不知道如何说,当应用程序打开时,显示第0行,然后等待24小时,然后显示第1行……如果你想让它与上次打开应用程序的时间相隔24小时,那么只需存储一个
NSDate即可