简体   繁体   中英

KAL Calendar, how to implement KalDataSource so as I can show events which are in iOS in-built Calendar app?

I have integrated Kal Calendar in my app successfully, here is the method how I show the calendar

-(void)showDepartDatePicker{
    NSLog(@"showDepartDatePicker");
    if(_departDatePicker != nil){
        [self.navigationController pushViewController:_departDatePicker animated:YES];
    }else{
        _departDatePicker = [[KalViewController alloc] init];
        _departDatePicker.title = @"Departure Date";
        _departDatePicker.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Today" style:UIBarButtonItemStyleBordered target:self action:@selector(showAndSelectTodayDeparturePicker)];
        _departDatePicker.kvcDelegate = self;
        [self.navigationController pushViewController:_departDatePicker animated:YES];
    }

}

I have added following in KalViewController.h,

@protocol KalViewControllerDelegate <NSObject>
@required
- (void)didSelectDate:(KalDate *)date andLoaded:(BOOL)loaded;

@end

and

@property (nonatomic, assign) id <KalViewControllerDelegate> kvcDelegate;

and implemented this delegate method in my viewController as

- (void)didSelectDate:(KalDate *)date andLoaded:(BOOL)loaded
{
    NSLog(@"Title : %@",[self.navigationController.visibleViewController title]);
    [self.navigationController popViewControllerAnimated:YES];
}

now, as per my question, I want to implement KalDataSource so as it show the day marked with events and selecting it show the event details in the table view available below Month's View.
Refer this link if you are new for Kal Calendar https://github.com/klazuka/Kal

Second Question, here is how I call delegate method from KalViewController.m

- (void)didSelectDate:(KalDate *)date
{
  self.selectedDate = [date NSDate];
  NSDate *from = [[date NSDate] cc_dateByMovingToBeginningOfDay];
  NSDate *to = [[date NSDate] cc_dateByMovingToEndOfDay];
  [self clearTable];
  [dataSource loadItemsFromDate:from toDate:to];
  [tableView reloadData];
  [tableView flashScrollIndicators];
  //line below calls my delegate method
  [self.kvcDelegate didSelectDate:date andLoaded:_loaded];
}

What happens is, when I call showDepartDatePicker to push KalViewController to my navigation stack, it calls my delegate method 2 times(which should be called on date selection), then for every date selection calls that delegate method again(1 time).

Even I want to limit this calendar not to show past dates! Please help me out on this.

  1. Define a class which implements the KalDataSource protocol. See below example for class implementing KalDataSource protocol.

     //header file #import Kal.h" @interface MyClass : NSObject <KalDataSource> @property (nonatomic, weak) id<KalDataSourceCallbacks> kalCallbackDelegate; @property (nonatomic, strong) NSArray *events; @end ---------------------- //implementation file - (void)presentingDatesFrom:(NSDate *)fromDate to:(NSDate *)toDate delegate:(id<KalDataSourceCallbacks>)callbackDelegate { //If you already have the events between fromDate and toDate then just call [callbackDelegate loadedDataSource:self]; //Else store the callback variable in a property and do an asyncrhonous //call to load the events. self.kalCallbackDelegate = callbackDelegate; //When the Asynchronous call is done, call [self.kalCallbackDelgate loadedDataSource:self]; } - (void)removeAllItems { self.eventsForDay = nil; } - (NSArray *)markedDatesFrom:(NSDate *)fromDate to:(NSDate *)toDate { //self.events may have multiple events with the same date. This pulls only the unique dates. //Also assumes that the object has an eventDate property for the beginning of the day NSMutableSet *uniqueDatesSet = [NSMutableSet setWithArray:[self.events valueForKeyPath:@"@distinctUnionOfObjects.eventDate"]]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self >= %@ && self <= %@", fromDate, toDate]; NSArray *uniqueDates = [[uniqueDatesSet allObjects] filteredArrayUsingPredicate:predicate]; return uniqueDates; } - (void)loadItemsFromDate:(NSDate *)fromDate toDate:(NSDate *)toDate { //filter for the events that occur between fromDate and toDate NSPredicate *predicate = [NSPredicate predicateWithFormat:@"eventDate >= %@ && eventDate <= %@", fromDate, toDate]; NSArray *filteredArray = [self.events filteredArrayUsingPredicate:predicate]; self.eventsForDay = [filteredArray sortedArrayUsingSelector:@selector(compareByEventTime:)]; } 
  2. To render the UITableViewCells, implement tableView:cellForRowAtIndexPath: in your KalDataSource class just like you would for a UITableView .

     - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { Event *event = [self.events objectAtIndex:indexPath.row]; static NSString *identifier = @"MyCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; cell.selectionStyle = UITableViewCellSelectionStyleNone; } cell.textLabel.text = event.title; return cell; } 
  3. If you want to know when a UITableViewCell is selected, define a class implementing the UITableViewDelegate protocol and set _departDatePicker.delegate equal to that class. Then you can implement the regular UITableViewDelegate methods in that class.

     - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { Event *event = [self.events objectAtIndex:indexPath.row]; MyViewController *viewController = [[UIStoryboard storyboardWithName:@"iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"eventInfo"]; viewController.event = event; [self.navigationController pushViewController:viewController animated:YES]; } 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM