0

I'm adding a calendar view to my app using Kal Calendar but am having problems implementing a didSelectRowAtIndexPath method on the event list. 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. Where is the appropriate place to call such a method?

Chris
  • 1,180
  • 1
  • 9
  • 17

1 Answers1

1

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
LeoSarena
  • 189
  • 2
  • 8
  • That looks similar to what I ended up with. Turned out my main issue was not having the delegate set properly! :) – Chris Mar 07 '13 at 04:40