5

我有一个 ViewController 对数组执行随机洗牌并将文本吐出到标签(在viewDidLoad方法中)。问题是,每当我导航到同一个 ViewController 时,它都会再次执行随机播放,我只需要它每天随机播放一次。

所以我需要检查这个 ViewController 是否已经在同一天(即从午夜开始)加载,然后我可以将 shuffle 放入 if 语句中。无论应用程序是否打开,我都可以在午夜安排随机播放吗?

我已经研究过将布尔值设置为NSUserDefaults:类似hasLoadedSinceMidnight但无法弄清楚如何在午夜重置布尔值。

4

2 回答 2

7

您可以实现 AppDelegate 的显着TimeChange 方法:

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

此方法在每个午夜和重要的时间更改期间(例如时区更改)调用。如果您的应用在收到事件时关闭,则该方法将在您的应用下一次打开时调用。

更多信息可以在这里查看

在 ViewController 中而不是在 AppDelegate 中执行相同操作的另一种方法是添加:

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

然后您可以在-(void)performAction;该 ViewController 的方法中执行您的随机播放操作。

于 2013-03-21T01:18:20.840 回答
0

BOOL您可以存储NSDate上次随机播放的日期/时间 ( ),而不是存储 a 。

然后通过比较存储的日期和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


更新:

根据要求,这里是一些示例代码。诚然,可能有更好的解决方案,但我相信这段代码片段将帮助您解决问题。这样做是检查是否有使用 保存的日期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]);
于 2013-03-19T19:22:52.330 回答