1

我对 iOS 开发相当陌生,并且有一个快速的问题。我一直在使用UITableView's一些示例应用程序开发进行练习,并注意到数据源往往是某种集合,例如NSArray. 看来这背后的原因是您可以将当前的索引映射UITableViewCell到数据源中的正确索引。

所以现在我终于开始着手我开始学习Objective-C和 iOS 开发时想做的项目了。一个日历应用程序,在UITableView. 我的问题是,由于我正在从EKCalendar中的一个对象访问事件EKEventStore,并且每天有多个包含不同事件的日历,您将如何使用UITableView's数据源进行设置?我最初刚刚创建了NSArray一个NSDates从今天开始向后三年,从今天开始向前三年,然后我可以将表视图的索引映射到这个作为数据源。这听起来不像是做这件事的正确方法,因为如果用户需要前进超过三年怎么办?我假设有一个更有效的庄园或更好的方法来做到这一点。

- (id)init {
    self = [super init];

    if (self) {
        //Get calendar access from the user.
        [self initCalendars];

        DateUtility *dateUtility = [[DateUtility alloc] init];

        NSMutableArray *dates = [[NSMutableArray alloc] init];

        //Build array of NSDates for sharing with the View Controller
        //This seems like the incorrect way to do this...
        //Backwards three years
        for (int date = -(365*3); date < 0; date++) {
            [dates addObject:[dateUtility adjustDate:[NSDate date] byNumberOfDays:date]];
        }

        //Forward three years
        for (int date = 0; date < (365*3); date++) {
            [dates addObject:[dateUtility adjustDate:[NSDate date] byNumberOfDays:date]];
        }
    }

    return self;
}

- (void)initCalendars {
    //respondsToSelector indicates iOS 6 support.
    if ([self.eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {
        //Request access to user calendar
        [self.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
            if (granted) {
                NSLog(@"iOS 6+ Access to EventStore calendar granted.");
            } else {
                NSLog(@"Access to EventStore calendar denied.");
            }
        }];
    } else { //iOS 5.x and lower support if Selector is not supported
        NSLog(@"iOS 5.x < Access to EventStore calendar granted.");
    }

    //Store a reference to all of the users calendars on the system.
    self.calendars = [self.eventStore calendarsForEntityType:EKEntityTypeEvent];

    [self.eventStore reset];
}

如果您想查看我的所有代码的作用,这是 adjustDate 方法。

- (NSDate *)adjustDate:(NSDate *)date byNumberOfDays:(NSUInteger)numberOfDays {
    NSDateComponents *components = [[NSDateComponents alloc] init];
    components.day = numberOfDays;

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

    return [calendar dateByAddingComponents:components toDate:date options:0];
}

尝试EKCalendars将事件存储中的多个数据用作单个数据源的最佳设计模式是UITableView什么?您将如何将日历的日期设置为数据源,无论特定日期有多少事件,或者无论使用的日历如何?

谢谢你的帮助!

4

1 回答 1

1

我想我找到了一个相当不错的方法,我已经实施了,所以我会回答我的问题。

我的数据源实例化了一个跨越 12 个月的 NSDates 数组。当我从数据源中提取 NSDate 引用时,它会监视正在使用的当前索引。当索引开始接近数组中的 lastObject 时,数据源模型继续运行并生成额外 6 个月的 NSDates。

由于我增加了数据源中的对象数量(在我的模型中),我添加了一个名为 setNeedsNumberOfItemsRefreshed 的 BOOL 属性。然后,我使用 View Controller 作为观察者设置 KVO,观察 setNeedsNumberOfItemsRefreshed 属性。当我将项目添加到数据源时,我设置了 setNeedsNumberOfItemsRefreshed = YES 并且我的视图控制器在我的表视图上调用 reloadData 来更新 numberOfItemsInSection。到目前为止,对我来说似乎工作得很好。

于 2013-07-04T03:46:34.343 回答