0

Kal カレンダーをアプリに正常に統合しました。カレンダーを表示する方法は次のとおりです。

-(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 を実装したいと考えています。
Kal カレンダーを初めて使用する場合は、このリンクを参照してくださいhttps://github.com/klazuka/Kal

2 番目の質問です。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 回)。

このカレンダーに過去の日付が表示されないように制限したいのです。これについて私を助けてください。

4

1 に答える 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. UITableViewCells をレンダリングするにtableView:cellForRowAtIndexPath:KalDataSourceUITableView.

    - (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.delegateUITableViewDelegate

    - (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];
    }
    
于 2013-05-06T15:06:16.613 に答える