2013-06-16 2 views
1

Я довольно новичок в разработке iOS и задал быстрый вопрос. Я использовал UITableView's в некоторых примерах разработки приложений для практики и заметил, что источник данных имеет тенденцию быть какой-то коллекцией, такой как NSArray. Похоже, причина в том, что вы можете сопоставить индекс текущего UITableViewCell с соответствующим индексом в источнике данных.Использование календарных дней в качестве источника данных UITableView в iOS

Итак, теперь я, наконец, приступаю к работе над проектом, который я хотел сделать, когда начал учиться 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? Как настроить даты календаря в качестве источника данных, независимо от количества событий, которые есть в тот или иной день, или независимо от используемого календаря?

Спасибо за помощь!

ответ

1

Я думаю, что нашел довольно приличный подход к этому, который я внедрил, поэтому я отвечу на свой вопрос.

В моем экземпляре datasource имеется массив NSDates, который охватывает 12 месяцев. Когда я извлекаю ссылки NSDate из источника данных, он отслеживает текущий индекс, который используется. Когда индекс начинает приближаться к lastObject в массиве, модель источника данных идет вперед и генерирует дополнительные NSDates на 6 месяцев.

Поскольку я увеличиваю количество объектов в своем источнике данных (в моей модели), я добавил свойство BOOL, называемое setNeedsNumberOfItemsRefreshed. Затем я устанавливаю KVO с помощью My View Controller в качестве наблюдателя, соблюдая свойство setNeedsNumberOfItemsRefreshed. Когда я добавляю элементы в источник данных, я устанавливаю setNeedsNumberOfItemsRefreshed = YES, а мой View Controller вызывает reloadData в моем представлении таблицы, который обновляет numberOfItemsInSection. Кажется, для меня достаточно хорошо работает.

+0

Пожалуйста, поделитесь примером кода. – Sandy

Смежные вопросы