0

カレンダーにカスタム kal データソースを使用してみます。データの取得に成功しましたが、実行しようとすると、次のエラーが発生し続けます。

-[NSNull cc_componentsForMonthDayAndYear]: unrecognized selector sent to instance 0x2823fb8

私のコード

//  KalParseDataSource.m

#import "KalParseDataSource.h"
#import <Parse/Parse.h>

@implementation KalParseDataSource

static BOOL IsDateBetweenInclusive(NSDate *date, NSDate *begin, NSDate *end)
{
    return [date compare:begin] != NSOrderedAscending && [date compare:end] != NSOrderedDescending;
}

- (id)init
{
    if ((self = [super init])) {
        items = [[NSMutableArray alloc] init];
        events= [[NSMutableArray alloc] init];
    }
    return self;
}

#pragma mark UITableViewDataSource protocol conformance

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier = @"MyCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    cell.textLabel.text = @"Filler text";
    return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 0;
}

- (void)presentingDatesFrom:(NSDate *)fromDate to:(NSDate *)toDate delegate:(id<KalDataSourceCallbacks>)delegate{
    NSLog(@"getting data");
    if ([events count] > 0) {
        [delegate loadedDataSource:self];
        return;
    }
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    [fmt setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
    PFUser *user = [PFUser currentUser];
    PFQuery *query = [PFQuery queryWithClassName:@"CalendarEvents"];
    [query whereKey:@"user" equalTo:user];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            [events removeAllObjects];
            [events addObjectsFromArray:objects];
            [delegate loadedDataSource:self];
        } else {
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
    }];

}

- (NSArray *)markedDatesFrom:(NSDate *)fromDate to:(NSDate *)toDate {
    return [[self tagsFrom:fromDate to:toDate] valueForKeyPath:@"date"];
}

- (void)loadItemsFromDate:(NSDate *)fromDate toDate:(NSDate *)toDate {
    [items addObjectsFromArray:[self tagsFrom:fromDate to:toDate]];
}

- (NSArray *)tagsFrom:(NSDate *)fromDate to:(NSDate *)toDate
{
    NSMutableArray *matches = [NSMutableArray array];
    for (PFObject *event in events){
        if (IsDateBetweenInclusive([event objectForKey:@"event_date"], fromDate, toDate)){
            [matches addObject:event];
        }
    }
    return matches;
}

- (void)removeAllItems{
    [items removeAllObjects];
}
@end

カレンダーを保持しているビューコントローラー。

#import "MainMenuViewController.h"
#import "Kal.h"
#import "KalParseDataSource.h"
@interface MainMenuViewController ()

@end

@implementation MainMenuViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    id<KalDataSource> source = [[KalParseDataSource alloc] init];
    KalViewController *calendar = [[KalViewController alloc] init];
    calendar.dataSource = source;


    [self addChildViewController:calendar];
    [calendar didMoveToParentViewController:self];
    [self.view addSubview:calendar.view];


}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



@end

私はこれで3日間立ち往生しています。このサードパーティのフレームワークhttps://github.com/klazuka/Kalを使用する簡単な例を誰か教えてください。レポのものは少し複雑に思えます。カスタム データ ソースを使用したいだけです。

4

1 に答える 1

0

cc_componentsForMonthDayAndYear呼び出しているnull関数は、関数が呼び出されている場所からそこにデバッグを配置し、呼び出されている関数がオンNSDateになっていて解放されていないかどうかを確認しているようです。

またEnable Zombies、クラッシュが発生したときに解放されたオブジェクトをいつでも見つけることができます。NSZombieEnabledに設定することで変数が解放されたかどうかを追跡できますYES。ゾンビを有効にすると、割り当て解除されたオブジェクトへのメッセージが奇妙な動作をしたり、わかりにくい方法でクラッシュしたりすることはなくなりますが、代わりにメッセージをログに記録し、予測可能でデバッガーのブレークポイント可能な方法で終了します。以下の手順で設定できNSZombieEnabledます。

上のメニュー バーから [製品] を選択します。alt/option を押したままにして、"Test..." または "Run..." を選択します。

NSZombieEnabled YES1. [引数] タブに移動し、[環境変数] セクションに追加します。

また

2. [診断] タブに移動し、[Enable Zombie Objectsメモリ管理] セクションを確認します。

于 2013-08-30T06:06:39.060 に答える