簡體   English   中英

KAL日歷,如何實現KalDataSource,以便我可以顯示iOS內置日歷應用程序中的事件?

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

我已成功將Kal 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];
    }

}

我在KalViewController.h中添加了以下內容,

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

@end

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

並在我的viewController中實現了這個委托方法

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

現在,按照我的問題,我想實現KalDataSource,以便它顯示帶有事件標記的日期,並選擇它在Month's View下方的表格視圖中顯示事件詳細信息。
如果您是Kal Calendar的新用戶,請參考此鏈接https://github.com/klazuka/Kal

第二個問題,這是我如何從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];
}

發生的是,當我調用showDepartDatePicker將KalViewController推送到導航堆棧時,它將調用我的委托方法2次(應在日期選擇時調用),然后對於每個日期選擇再次調用該委托方法(1次)。

即使我也想限制此日歷不顯示過去的日期! 請幫助我。

  1. 定義一個實現KalDataSource協議的類。 有關實現KalDataSource協議的類,請參見下面的示例。

     //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. 要呈現UITableViewCells,請像在UITableView那樣在KalDataSource類中實現tableView:cellForRowAtIndexPath: KalDataSource

     - (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. 如果您想知道何時選擇UITableViewCell ,請定義實現UITableViewDelegate協議的類,並將_departDatePicker.delegate設置_departDatePicker.delegate等於該類。 然后,您可以在該類中實現常規的UITableViewDelegate方法。

     - (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]; } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM