简体   繁体   English

使用Kal日历选择事件

[英]Selecting events using Kal calendar

I'm adding a calendar view to my app using Kal Calendar but am having problems implementing a didSelectRowAtIndexPath method on the event list. 我正在使用Kal Calendar将日历视图添加到我的应用中,但是在事件列表上实现didSelectRowAtIndexPath方法时遇到了问题。 I would like to push a view controller when the user selects an event for any given day. 我想在用户选择任何给定日期的事件时推送视图控制器。 I've tried putting the method in "KalView.m", "KalViewController.m", and "KalDataSource.m", but none are recognized. 我尝试将方法放在“ KalView.m”,“ KalViewController.m”和“ KalDataSource.m”中,但是没有一个被识别。 Where is the appropriate place to call such a method? 在哪里可以调用这种方法?

I had similar issue once, Here is how I implemented it. 我曾经有过类似的问题,这是我如何实现的。

#import <MTDates/NSDate+MTDates.h>
#import <ObjectiveSugar/ObjectiveSugar.h>
#import <UIImageView+WebCache.h>

#import "EventsViewController.h"
#import "EventDetailsViewController.h"
#import "EventCell.h"
#import "Event.h"

#import "KalViewController.h"
#import "CalendarViewController.h"

@implementation EventsViewController

- (id)initWithEvents:(NSArray *)_events {
    self = [super init];
    events = _events;
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self listUpdated];
    [self addCalendarView];
}

- (void)listUpdated
    {

        NSMutableArray *allEvents = [NSMutableArray array];
        [allEvents addObjectsFromArray:events];

        NSArray *sortedArray = [allEvents sortedArrayUsingComparator:^NSComparisonResult(Event *obj1, Event *obj2) {
            return [obj1.date compare:obj2.date];
        }];

        _allEvents = sortedArray;
    }

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [_allEvents count];
}

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//custom table cell (EventCell is a view I'm initialising my rows with)
    Event *event = _allEvents[indexPath.row];
    NSString *reuseIdentifier = [NSString stringWithFormat:@"Cell%@%@", event.venue.identifier, event.identifier];
    EventCell *cell = (EventCell*) [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    if (!cell) {
        cell = [EventCell createDetailedCellWithReuseIdentifier:reuseIdentifier];
        cell.nameLabel.text = event.name;
    }
    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    Event *event = _allEvents[indexPath.row];
    EventDetailsViewController *controller = [[EventDetailsViewController alloc] initWithEvent:event];
    [self.navigationController pushViewController:controller animated:YES];
}

- (void) addCalendarView{
    _calenderView = [[KalViewController alloc] initWithSelectedDate:[NSDate date]];
    [[self.view viewWithTag:2] addSubview:_calenderView.view]; /* depends on your requirements*/
    _calenderView.view.tag = 200; /* not necessary */
    [_calenderView.view setFrame:self.view.bounds];
    _calenderView.dataSource = self;
    _calenderView.delegate = self;
}

- (void)loadItemsFromDate:(NSDate *)fromDate toDate:(NSDate *)toDate {
    //NSLog(@"%@, %@", fromDate, toDate);
    // filter and pass the array to the events tableview
    [self filterByDateSelected:toDate];
}

-(void)presentingDatesFrom:(NSDate *)fromDate to:(NSDate *)toDate delegate:(id<KalDataSourceCallbacks>)delegate
{
   /** when selecting a different month **/
}

- (void)removeAllItems
{
    NSLog(@"Items Removed");
    // remove all the previous items from the tableview
}

-(void) filterByDateSelected: (NSDate *)selectedDate
{
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd"];

    NSString *theDate = [dateFormat stringFromDate:selectedDate];
    NSDate *_date = [NSDate dateFromString:theDate usingFormat:@"yyyy-MM-dd"];

    // filter table by selectedDate
    NSArray *_dateFilteredEvents = _allEvents;

    _dateFilteredEvents = [_allEvents filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(Event *evaluatedEvent, NSDictionary *bindings) {
        if ([evaluatedEvent.date isEqualToDate:_date]) {
            return YES;
        }
        return NO;
    }]];
    NSLog(@"%@", _dateFilteredEvents);

     //  uncomment the following line if you want to display list in another controller 
    //[self showEventsByDate:_dateFilteredEvents];

   // or else refresh table after updating the list
  _allEvents = _dateFilteredEvents;
        [_tableView reloadData];
}

- (void) showEventsByDate:(NSArray*)events
{
    if (events.count > 0) {
        CalendarViewController *_controller = [[CalendarViewController alloc] initWithEventArray:events];
        [self.navigationController pushViewController:_controller animated:YES];
    }
}

- (void) removeCalenderView{
    [_calenderView.view removeFromSuperview];
}

@end

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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