2013-03-19 72 views
5

我有一个ViewController对数组执行随机洗牌并将文本吐出到Label(在viewDidLoad方法中)。问题是,无论何时我导航到相同的ViewController时,它都会再次执行洗牌,我只需要每天洗牌一次。检查是否自午夜以来已加载视图

因此,我需要检查此ViewController是否在同一天之前(即从午夜开始)被加载,然后我可以将该洗牌放入if语句中。无论应用程序是否打开,我是否可以在午夜安排洗牌?

我已经研究过将布尔值设置为NSUserDefaults:类似hasLoadedSinceMidnight,但后来无法确定如何在午夜重置布尔值。

+0

这将是一种方式,但你也需要保存你正在“洗牌”并加载这些项目的状态。 – 2013-03-19 18:49:45

+0

数组对象来自CoreData,因此它们已经被保存。该方法只是将它们加载到一个数组中,并将它们混洗到另一个数组中。 – RoshDamunki 2013-03-19 19:35:30

回答

7

您可以实现的AppDelegate中的significantTimeChange方法:

-(void)applicationSignificantTimeChange:(UIApplication *)application { 
    //tell your view to shuffle 
} 

这种方法被称为每一个午夜,在显著时间的变化,例如更改时区。如果您的应用在收到活动时关闭,则在下次打开您的应用时会调用此方法。

更多信息,可以查看here

的另一种方法做同样的事情,你的视图控制器内,而不是在AppDelegate的是添加:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(performAction) name:UIApplicationSignificantTimeChangeNotification object:nil]; 

,然后你可以执行你的该ViewController的-(void)performAction;方法中的随机操作。

+1

+1或更好:订阅['UIApplicationSignificantTimeChangeNotification'](http://developer.apple.com/library/ios/documentation/uikit/reference/UIApplication_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006728-CH3-SW44)在视图控制器 – vikingosegundo 2013-03-21 01:21:11

+0

这是真的。我补充说。 – Jsdodgers 2013-03-21 01:25:32

+0

+1比我建议的要好得多! – rog 2013-03-21 01:29:40

0

取代存储BOOL,您可以存储上次随机播放的日期/时间(NSDate)。

然后通过比较存储日期和viewDidAppear中的当前日期,检查自上次洗牌后是否已经过午夜。

NSTime文档:http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html

而且NSDateFormatter文档: https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40003643


UPDATE:

按照要求,这里是一些示例代码。无可否认,这可能是更好的解决方案,但我相信这段代码会帮助你解决问题。这样做是检查是否有使用NSUserDefaults保存的日期,然后与当前日期进行比较。如果日期不匹配,请将数组随机播放,然后保存当前日期(再次使用NSUserDefaults)。 (我已经采取做的假设,确实时间会继续前进的自由,所以它不检查,以确保lastSavedDate以前currentDate

NSDate *currentDate = [[NSDate alloc] init]; 
NSDate *lastShuffleDate = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastShuffleDate"]; 

// check to see if there is a prior shuffle date 
// if there is not, shuffle the array and save the current date 
if (!lastShuffleDate) { 
    NSLog(@"No object set for 'lastShuffleDate'"); 

    //[self shuffleMyArray]; 

    [[NSUserDefaults standardUserDefaults] setObject:currentDate forKey:@"lastShuffleDate"]; 
    return; 
} 

// set up the date formatter 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
[dateFormatter setLocale:usLocale]; 
[dateFormatter setDateStyle:NSDateFormatterShortStyle]; 

NSLog(@"Current Date: %@", [dateFormatter stringFromDate:currentDate]); 
NSLog(@"Saved Date: %@", [dateFormatter stringFromDate:lastShuffleDate]); 

// check to see if the dates are the same by comparing the dates as a string 
if (![[dateFormatter stringFromDate:currentDate] isEqualToString:[dateFormatter stringFromDate:lastShuffleDate]]) { 
    NSLog(@"Dates are different...!"); 

    //[self shuffleMyArray]; 

} else { 
    NSLog(@"Dates are the same... (midnight has not passed)"); 
} 

// save the time of the last shuffle 
[[NSUserDefaults standardUserDefaults] setObject:currentDate forKey:@"lastShuffleDate"]; 

在这一点上,你没有真正的理由来检查时间,但我已经包括它,以防万一你好奇。

// remote dateStyle and set timeStyle to check times 
[dateFormatter setDateStyle:NSDateFormatterNoStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 
NSLog(@"Current Time: %@", [dateFormatter stringFromDate:currentDate]); 
NSLog(@"Saved Time: %@", [dateFormatter stringFromDate:lastShuffleDate]); 
+0

有趣的 - 所以当视图加载并保存到'NSUserDefaults'时创建一个时间戳?或者只是在视图中执行检查方法? – RoshDamunki 2013-03-19 19:39:03

+0

当您洗牌时,将时间存储在NSUserDefaults中。在viewDidAppear(可能是您需要的更好的选项)中,检查当前时间与NSUserDefaults中保存的时间,并确定午夜是否已过。如果有,重新洗牌并用当前时间更新NSUserDefaults以反映最后一次洗牌。 – rog 2013-03-19 19:42:37

+0

你可以给我一些示例代码。我试图让这个工作,但似乎无法。 'timeIntervalSinceNow'返回两个日期之间的秒数。如果用户在23点45分打开应用程序,然后在00点01分再打开应用程序,只有16分钟(960秒)已经过去。因此,<86400s已经通过,但是这是第二天。这两个日期的“NSDayCalendarUnit”会比较吗? (如果他们不==然后洗牌) – RoshDamunki 2013-03-20 09:43:59