私はgithubで見つけたプロジェクトを使用しています.andを使用できますNSFetchedResultsController
.UICollectionView
プロジェクトはこれです
私のプロジェクトでは、2 つのエンティティを持つコア データがあり、Element
との間にDocument
は 1 対多の関係があるため、は複数持つことができますが、は 1 つしか持つことができません。次に、 でこれを行います。Element
Document
Element
Document
Document
Element
AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
ElementViewController *elementView = [[ElementViewController alloc] initWithNibName:@"ElementViewController" bundle:nil];
elementView.managedObjectContext = self.managedObjectContext;
DocumentViewController *documentView = [[DocumentViewController alloc] initWithNibName:@"DocumentViewController" bundle:nil];
documentView.managedObjectContext = self.managedObjectContext;
elementView.documentView = documentView;
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:elementView];
self.window.rootViewController = navController;
[self.window makeKeyAndVisible];
return YES;
}
これはアプリデリゲートです。次にElementViewController
、UICollectionView
withNSFetchedResultsController
があり、すべて正常に動作します。 a を選択すると、 がUICollectionViewCell
開きますDocumentViewController
。
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
self.documentView.element = [self.fetchedResultsController objectAtIndexPath:indexPath];
[self.navigationController pushViewController:self.documentView animated:YES];
}
次に、これは私のものDocumentViewController.h
です:
#import <UIKit/UIKit.h>
#import "Element.h"
@interface DocumentViewController : UIViewController <NSFetchedResultsControllerDelegate>
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;
@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
@property (strong, nonatomic) Element *element;
@end
また、ここでは、タイトルNSFetchedResultsController
の述語にフィルターがあります。Element
- (NSFetchedResultsController *)fetchedResultsController
{
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"docDate" ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"SUBQUERY(element, $b, $b.name == %@).@count > 0", self.element.name]];
// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _fetchedResultsController;
}
そして、私はこれも追加しました:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self reloadCollectionView];
[self addDocument];
}
- (void)reloadTableView
{
self.fetchedResultsController = nil; //Because not search every time for different Element
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Error in search %@, %@", error, [error userInfo]);
} else {
[self.collectionView reloadData];
}
}
次に、viewWillAppear には次のaddDocument
メソッドがあります。
- (void)addDocument
{
Document *document = (Document *)[NSEntityDescription
insertNewObjectForEntityForName:@"Document"
inManagedObjectContext:self.managedObjectContext];
[document setDocName:[title contents]];
[document setElement:self.element]; //here the app crash
}
そして、私はこれらのエラーを受け取ります:
CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. Can't perform collection evaluate with non-collection object. with userInfo (null)
2013-01-25 10:28:56.392 App[383:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Can't perform collection evaluate with non-collection object.'
誰でも私を助けることができますか?
編集: これは NSManagedObjectClass です:
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class Document;
@interface Element : NSManagedObject
@property (nonatomic, retain) NSString * dateFormat;
@property (nonatomic, retain) NSString * dateFormat2;
@property (nonatomic, retain) id img;
@property (nonatomic, retain) NSDate * imgDate;
@property (nonatomic, retain) NSString * imgUrl;
@property (nonatomic, retain) NSString * language;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * name2;
@property (nonatomic, retain) NSString * pathDocuments;
@property (nonatomic, retain) NSNumber * releaseDateWeek;
@property (nonatomic, retain) NSNumber * type;
@property (nonatomic, retain) NSSet *documents;
@end
@interface Element (CoreDataGeneratedAccessors)
- (void)addDocumentsObject:(Document *)value;
- (void)removeDocumentsObject:(Document *)value;
- (void)addDocuments:(NSSet *)values;
- (void)removeDocuments:(NSSet *)values;
@end
@interface ImageToDataTransformer : NSValueTransformer {
}
@end
Document.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class Element;
@interface Document : NSManagedObject
@property (nonatomic, retain) NSDate * docDate;
@property (nonatomic, retain) id docImage;
@property (nonatomic, retain) NSString * docName;
@property (nonatomic, retain) NSString * docPath;
@property (nonatomic, retain) NSNumber * docSize;
@property (nonatomic, retain) NSString * docUrl;
@property (nonatomic, retain) NSNumber * isDownloading;
@property (nonatomic, retain) NSNumber * isStored;
@property (nonatomic, retain) NSNumber * pageNumber;
@property (nonatomic, retain) NSString * password;
@property (nonatomic, retain) NSNumber * progressBar;
@property (nonatomic, retain) Element *element;
@end