Reputation: 394
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.
Upvotes: 0
Views: 1126
Reputation: 1190
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:)];
}
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;
}
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];
}
Upvotes: 1