2013-02-05 2 views
0

나는 여기에 내가 달력을 표시하는 방법 방법, 성공적으로 내 애플 리케이션에 칼 달력을 통합 한KAL 캘린더, iOS 내장 캘린더 앱에있는 일정을 표시 할 수 있도록 KalDataSource를 구현하는 방법은 무엇입니까?

-(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를 구현하여 이벤트가 표시된 요일을 표시하고이 이벤트를 선택하면 월간보기 아래의 테이블보기에서 이벤트 세부 정보가 표시됩니다. 당신이 칼 달력 https://github.com/klazuka/Kal

두 번째 질문에 대한 새로운 경우
이 링크를 참조하십시오, 여기에 내가 KalViewController.m에서 위임 메소드를 호출하는 방법입니다

내가 showDepartDatePicker가 KalViewController을 밀어 호출 할 때
- (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]; 
} 

무슨 일이며, 내 탐색 스택, 그것은 내 대리자 메서드를 2 번 (날짜 선택시 호출해야 함) 호출 한 다음 모든 날짜 선택에 대해 해당 대리자 메서드를 다시 호출합니다 (1 회).

심지어이 캘린더는 과거 날짜가 표시되지 않도록 제한하고 싶습니다. 도와주세요.

답변

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. 은 당신이 UITableView에 대해서와 마찬가지로, UITableViewCells 렌더링하여 KalDataSource 클래스에서 tableView:cellForRowAtIndexPath:을 구현합니다.
    - (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을 설정합니다. 그런 다음 해당 클래스에 일반 UITableViewDelegate 메서드를 구현할 수 있습니다.

관련 문제