0

我的问题是:如何在 iOS 中的特定日期和时间加载特定图像?

我已经搜索了网络,但没有找到任何有用的东西。

我在 imageArray 中有一个图像列表,并希望每个图像都在特定的日期、时间和顺序显示。

外汇。说我想在 MyDateAndTime 上加载 MyImage。我怎样才能做到这一点?

图 1 - DateAndTime 1 图 2 - DateAndTime 2 图 3 - DateAndTime 3

任何建议表示赞赏,如果可能,请提供一些源代码。

4

3 回答 3

1

我提出了简单的逻辑,根据您的要求进行编辑,否则如果您对我的回答有任何疑问,请告诉我。

最好的方法是使用日期时间(dd_MM_yyyy_HH_mm_ss的名称存储您的图像并访问图像名称,例如,

NSString *imageName
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"dd_MM_yyyy_HH_mm_ss"];
imageName = [NSString stringWithFormat:@"%@.png", [formatter stringFromDate:[NSDate date]]]; // here you can set specific dateTime, i putted current dateTime

在这里你会得到imageName19_10_2013_6_13_21.png

通过这个图像名称,您可以从包或文档目录中获取图像。

于 2013-10-19T12:43:59.360 回答
1

如果您只想每分钟显示一张不同的图像,请使用此功能,否则请跳过下方以查看有用的日期信息。

NSTimeInterval secondsInMinute = 60;
[NSTimer timerWithTimeInterval:secondsInMinute target:self selector:@selector(minuteChanged:) userInfo:nil repeats:YES];

- (void)minuteChanged:(id)sender {
    // change image here
}

你的问题可能有很多不同的答案,你想动态创建这个日期吗?或者它是一个预定义的日期?一种解决方案是获取您要查找的日期的时间间隔。

NSDate* rightNow = [NSDate date];
NSTimeInterval timeInterval = [rightNow timeIntervalSince1970];

// since time intervals are in seconds we can just append the
// date as easily as adding time

NSInteger secondsInMinute = 60;
NSInteger minutesInHour = 60;
NSInteger hoursInDay = 24;
NSInteger daysInWeek = 7;

NSInteger secondsInWeek = secondsInMinute * minutesInHour * hoursInDay * daysInWeek;

timeInterval = timeInterval + secondsInWeek;
NSDate* aWeekInFuture = [NSDate dateWithTimeIntervalSince1970:timeInterval];

我想说的是设置日期最容易理解,但您也可以使用组件来动态设置未来日期。这会导致一些问题,但这是如何完成的。

NSDate* rightNow = [NSDate date];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* dateCompenents = [calendar components:(NSDayCalendarUnit | NSWeekCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:rightNow];

[dateCompenents setDay:dateCompenents.day + 7];

NSDate* aWeekInFuture = [calendar dateFromComponents:dateCompenents];

为了帮助解释这一点,这里是一些控制台日志

(lldb) po rightNow
$0 = 0x0b933440 2013-10-19 12:43:55 +0000
(lldb) po aWeekInFuture
$1 = 0x0ba32a60 2013-10-26 04:00:00 +0000

您会看到日期对于日、年、月是如何准确的,但请查看确切时间,当前时间(现在)是 12:43:55,但未来的一周是 4:00:00 这是因为我没有要求 NSMinutesCalendarUnit、NSHoursCalendarUnit、NSSecondsCalendarUnit ......所以如果我想要一个完美的日期,除非我要求每一件事,否则你可能并不需要如此准确,事实上你甚至可能想要设置你自己的时间。

现在,如果您想要一个静态日期,即用户输入的日期,您将需要使用NSDateFormatter下面的示例

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setCalendar:currentCalendar];
[dateFormatter setDateFormat:@"mm/dd/yyyy"];

NSDate* birthdayDate = [dateFormatter dateFromString:@"10/05/2013"];

现在您想知道如何知道今天是否是保存的指定日期。假设您将日期存储在NSUserDefaults服务器或某个地方,比较日期的最简单方法是使用比较功能NSDate

NSDate* rightNow = [NSDate date];
NSDate* storedDate = [[NSUserDefaults standardUserDefaults] objectForKey@"storedDate"] // some date from server, or UserDefaults

NSComparisonResult = [rightNow compare:storedDate];

这有点不足,因为它测试完美,但它会返回值NSOrderedSame是否相等,NSOrderedDescending如果storedDate 在rightNow 之后,NSOrderedAscending如果storedDate 在rightNow 之前。这完全取决于时间间隔。如果您只想要一个通用的一天,则必须通过组件对其进行测试

NSDate* rightNow = [NSDate date];
NSDate* birthdayDate = [[NSUserDefaults standardUserDefaults] objectForKey@"birthday"]

NSDateComponents* todayComponents = [currentCalendar components:(NSDayCalendarUnit | NSMonthCalendarUnit) fromDate:rightNow];
NSDateComponents* birthdayComponents = [currentCalendar components:(NSDayCalendarUnit | NSMonthCalendarUnit) fromDate:birthdayDate];

BOOL dayIsTheSame = ( todayComponents.day == birthdayComponents.day );
BOOL monthIsTheSame = ( todayComponents.month == birthdayComponents.month );

BOOL todayIsBirthday = ( dayIsTheSame && monthIsTheSame );

if (todayIsBirthday) {
    [self.imgViewBirthday setImage[UIImage imageNamed:@"cake.png"]];
}

在您的问题中,您指定了一个图像数组,假设您有一个不同的图像,具体取决于它是哪一小时或哪一分钟,您将在请求NSMinutesCalendarUnit作为该数组的索引后使用组件 todayComponent.minute;

UIImage* currentImageToDisplay = [self.arrayOfImage objectAtIndex:todayComponent.minute];
self.imageView.image = currentImageToDisplay;

参考: NSDateNSDateFormatterNSDateComponentsNSCalendarNSTimer

于 2013-10-19T13:23:57.890 回答
0

如果我现在了解您的问题,那么您可能会检查出使用递归块的一种奇特方法是:

#import <Foundation/Foundation.h>
#import <dispatch/dispatch.h>

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSArray* dates = @[@1, @1, @1, @1, @1, @1, @1, @1, @1];
        NSArray* urls = @[@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I"];

        NSEnumerator* dateIter = [dates objectEnumerator];
        NSEnumerator* urlIter = [urls objectEnumerator];

        typedef void(^block_t)(NSEnumerator* dateIter, NSEnumerator* urlIter);

        block_t asyncFunc;
        __block __weak block_t _asyncFunc = asyncFunc = ^(NSEnumerator* dateIter, NSEnumerator* urlIter) {
            NSNumber* date = [dateIter nextObject];
            NSString* url = [urlIter nextObject];
            if (date != nil && url != nil) {
                double delayInSeconds = [date doubleValue];
                dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
                dispatch_after(popTime, dispatch_get_global_queue(0, 0), ^(void){
                    NSLog(@"%@", url);
                    _asyncFunc(dateIter, urlIter);
                });
            }
            else {
                printf("\n");
                return;
            }
        };

        // start:
        asyncFunc(dateIter, urlIter);

        sleep (10);
    }
    return 0;
}

笔记:

“日期”实际上是“延迟”,在本示例中 URL 实际上只是字符串。您应该可以根据需要进行调整。当然,NSLog(@"%@", url);实际上会显示您的图像。

此外,块asyncFunc是异步的!

于 2013-10-19T13:09:12.717 回答