2015-02-05 2 views
0

Ненавидеть, чтобы задать этот вопрос, потому что, похоже, есть множество других подобных, но я все еще не вижу, что не так с моим после прохождения большинство ответов.CoreData: ошибка: не удалось вызвать назначенный инициализатор в классе NSManagedObject 'SCTrack'

У меня есть два VC, VC1 содержит список песен, полученных из музыкального сервиса. VC2 содержит список песен, выбранных из VC1; VC2 - это в основном плейлист.

Я установил имя и класс сущности для соответствия: SCTrack. Вот мой SCTrack.h:

@interface SCTrack : NSManagedObject 
@property (strong, nonatomic) NSString* title; 
@property (strong, nonatomic) NSString* stream_url; 

SCTrack.m:

#import "SCTrack.h" 
@implementation SCTrack 

@dynamic title; 
@dynamic stream_url; 

-(instancetype) initWithDictionary: (NSDictionary*) SCTrackDict { 
self = [self init]; 
if (self) { 
    self.title = SCTrackDict[@"title"]; 
    self.stream_url = SCTrackDict[@"stream_url"]; 

} 
return self; 
} 

+(NSMutableArray *) parseJSONData: (NSData *) JSONData { 
NSError* error; 
NSMutableArray* SCTrackArray = [NSMutableArray new]; 

NSArray *JSONArray= [NSJSONSerialization JSONObjectWithData:JSONData options:0 error: &error]; 
if ([JSONArray isKindOfClass:[NSArray class]]) { 
    for (NSDictionary* trackDict in JSONArray) { 
     SCTrack* trackObject = [[SCTrack alloc]initWithDictionary:trackDict]; 
     [SCTrackArray addObject:trackObject]; 
    } 
} 
return SCTrackArray; 
} 

@end 

Мои AppDelegate.m

UITabBarController* tabBar = (UITabBarController*) self.window.rootViewController; 
SCTrackListVC *SCVC = (SCTrackListVC*) [[tabBar viewControllers]objectAtIndex:2]; 

SCVC.managedObjectContext = self.managedObjectContext; 
return YES; 

В моей VC1.m

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
self.selectedTrack = self.SCTrackList[indexPath.row]; 
self.selectedTrackRow = indexPath.row; 

self.selectedTrack = [[SCTrack alloc]initWithEntity:[NSEntityDescription entityForName:@"SCTrack" inManagedObjectContext:self.managedObjectContext]insertIntoManagedObjectContext:self.managedObjectContext]; 

NSError* error; 
NSManagedObjectContext *context = self.managedObjectContext; 
if (![context save:&error]) { 
    NSLog(@"Error! %@", error); 
} 

//This is the other way I tried it _selectedTrack = [NSEntityDescription insertNewObjectForEntityForName:@"SCTrack" inManagedObjectContext:self.managedObjectContext]; 

В моей VC2.m

-(NSFetchedResultsController*) fetchedResultController { 
if (_fetchedResultController != nil) { 
    return _fetchedResultController; 
} 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *SCTrackEntity = [NSEntityDescription entityForName:@"SCTrack" inManagedObjectContext:[self managedObjectContext]]; 
[fetchRequest setEntity:SCTrackEntity]; 



// NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES]; 
// [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]]; 

_fetchedResultController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil cacheName:nil]; 

_fetchedResultController.delegate = self; 

return _fetchedResultController; 
} 

Это ошибка, я получаю: CoreData: Ошибка: Не удалось вызвать назначенный инициализатору на NSManagedObject класса 'SCTrack'

Очень новый для Core Data. Это было уже несколько часов. Спасибо, что указал мне в правильном направлении.

ответ

0

Назначенный инициализатор для объекта NSManaged - initWithEntity: insertIntoManagedObjectContext:. Изменение

SCTrack* trackObject = [[SCTrack alloc]initWithDictionary:trackDict]; 

в

SCTrack *trackObject = [[SCTrack alloc]initWithEntity:entity insertIntoManagedObjectContext:context]; 
+0

Ах, я вижу. Благодарю. Но разве это не спасет каждый SCTrack, который будет заселен в VC1? Я просто хочу сохранить SCTracks, которые добавлены только в VC2. –

+0

Да, это будет. Если вы не хотите сохранять объект NSManaged, почему вы его инициализируете на первом месте? –

+0

Я инициализирую его для отображения на VC1. Я хочу только выбрать несколько из них (VC1), чтобы сохранить в VC2 в качестве плейлиста. Я хочу, чтобы плейлист сохранялся. Я думаю, что я нахожу возможное решение, создав отдельный класс сущностей CoreData (называя его SCCoreDataTrack), чтобы представлять SCTrack для моего VC2 ... Но вы определенно дали мне огромный ключ. –

Смежные вопросы

 Смежные вопросы