0

2つの異なるビューコントローラーによって制御される2つの異なるビューがあります。各ビューには、UITableViewが含まれています。各UITableViewはNSFetchedResultsControllerにフックされています。ビュー1では、FRCの結果を絞り込みたくないので、述語を使用しません。ビュー2では、述語を使用して、BOOL(別名NSNumber!)値に基づいて特定のオブジェクトを取得します。しかし、この述語を使用しようとすると、ビュー2にセグエするときにNSRangeException(境界を超えたインデックス1)が発生します。また、述語を切り替えるとその例外がスローされます(ビュー1の述語、ビュー2の述語なし)。また、ビュー2にセグエを実行すると、例外が発生します。成功する場合があります(どちらも私が望むものではありません)。

1)どちらのフェッチ要求にも述語を使用しません。

2)ビュー1とビュー2の両方のフェッチ要求に同じ述語を使用します。

あなたの楽しみのためのいくつかのコード:

View1.mの場合:

-(NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
}
NSManagedObjectContext *context = [CoreDataHelper getContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"EditableSong" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                          initWithKey:@"dateModified" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
[fetchRequest setFetchBatchSize:5];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:context sectionNameKeyPath:nil
                                               cacheName:@"Root"];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;

return _fetchedResultsController;

}

View2.mで

-(NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
}
NSManagedObjectContext *context = [CoreDataHelper getContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"EditableSong" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                          initWithKey:@"dateModified" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"collaborative == %@", [NSNumber numberWithInt:0]];
[fetchRequest setPredicate:myPredicate];
[fetchRequest setFetchBatchSize:5];

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:context sectionNameKeyPath:nil
                                               cacheName:@"Root"];
NSLog(@"here");
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
return _fetchedResultsController;

}

そして、これは緑色のエラー矢印(SIGABRT)が指している場所です(このコードはView1とView2で同じです):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *MyIdentifier = [NSString stringWithFormat:@"MyIdentifier %i", indexPath.row];
SongTableViewCell *cell = (SongTableViewCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
    EditableSong *song = [_fetchedResultsController objectAtIndexPath:indexPath];//<<<------HERE!!! SIGABRT
    song.audioPlayer = [[AudioPlayer alloc] initWithSong:song];
    cell = [[SongTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier editableSong:song andVC:self];
    UIButton *playButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [playButton setBackgroundColor:[UIColor clearColor]];
    [playButton setImage:[UIImage imageNamed:@"mainmenuplay.png"] forState:UIControlStateNormal];
    playButton.frame = CGRectMake(300.0f, 15.0f, 65.0f, 65.0f);
    [playButton addTarget:self action:@selector(playSong:) forControlEvents:UIControlEventTouchUpInside];
    [cell.contentView addSubview:playButton];
}
return cell;

}

ありがとう!

アップデート1

これが私のnumberOfRowsInSectionメソッドです(これも両方のクラスで同じです):

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
id  sectionInfo =
[[_fetchedResultsController sections] objectAtIndex:section];
NSLog(@"%i", [sectionInfo numberOfObjects]);
return [sectionInfo numberOfObjects];

}

参考までに、そのログはView1に3、View2に1を出力することになっていますが、両方に3を出力します。

4

2 に答える 2

0

問題が解決しました:

キャッシュを nil に変更する必要がありました。

この投稿を参照してください。

http://iphoneincubator.com/blog/data-management/delete-the-nsfetchedresultscontroller-cache-before-ching-the-nspredicate

于 2012-08-15T23:44:56.930 に答える
0

間違った数のセルを返しているようです。cellForRowAtIndexPath:セルを作成したいのですが、ありませんobjectAtIndexPath

そのため、メソッドを確認する必要がありますnumberOfRowsInSection

于 2012-08-09T07:04:49.060 に答える