2013-02-14 52 views
0

我使用Kal Calendar将日历视图添加到我的应用程序,但在事件列表上实施didSelectRowAtIndexPath方法时遇到问题。我想在用户选择某一天的事件时推送视图控制器。我试过把这个方法放在“KalView.m”,“KalViewController.m”和“KalDataSource.m”中,但没有一个被识别出来。哪里可以调用这种方法?使用Kal日历选择事件

回答

1

我曾经有类似的问题,下面是我如何实现它。

#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 
+0

这看起来类似于我结束了。原来我的主要问题是没有正确设置代表! :) – user1390486 2013-03-07 04:40:04

+0

很高兴听到您的问题解决! :) – LeoSarena 2013-03-22 11:50:51