2013-02-14 122 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