我有一个ViewController,它在数组上执行随机shuffle并将文本吐出到Label(在viewDidLoad
方法中)。问题是,无论何时我导航到同一个ViewController,它都会再次执行shuffle,我每天只需要它来洗牌。
所以我需要检查这个ViewController是否在SAME日之前(即从午夜开始)加载,然后我可以将shuffle放入if语句中。无论应用程序是否打开,我都可以在午夜安排洗牌吗?
我已经研究过将布尔值设置为NSUserDefaults
:类似于hasLoadedSinceMidnight
但是无法解决如何在午夜重置布尔值。
答案 0 :(得分:7)
您可以实现AppDelegate的significantTimeChange方法:
-(void)applicationSignificantTimeChange:(UIApplication *)application {
//tell your view to shuffle
}
此方法每隔午夜调用一次,并在重要时间更改(例如时区更改)期间调用。如果您的应用在收到活动时关闭,则下次打开您的应用时会调用此方法。
可以查看更多信息here
在ViewController中而不是在AppDelegate中执行相同操作的另一种方法是添加:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(performAction) name:UIApplicationSignificantTimeChangeNotification object:nil];
然后你可以在该ViewController的-(void)performAction;
方法中执行shuffle操作。
答案 1 :(得分:0)
您可以存储上次随机播放的日期/时间(BOOL
),而不是存储NSDate
。
然后通过比较viewDidAppear
中的存储日期和当前日期,检查自上次洗牌以来是否已经过了午夜。
和NSDateFormatter
文档:
https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40003643
更新:
根据要求,这里有一些示例代码。不可否认,这可能是更好的解决方案,但我相信这段代码片段可以帮助您解决问题。这样做是检查是否使用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]);