2015-02-05 3 views
0

다른 유사한 것들이 많이 있기 때문에이 질문을하는 것이 싫어 만 계속 지나간 후 ​​내 문제가 무엇인지 알 수 없습니다. 대부분의 답변.CoreData : 오류 : NSManagedObject 클래스의 'SCTrack'에서 지정된 초기화 프로그램을 호출하지 못했습니다.

VC가 두 개 있습니다. VC1에는 음악 서비스에서 가져온 노래 목록이 들어 있습니다. VC2는 VC1에서 선택한 노래 목록을 포함합니다. VC2는 기본적으로 재생 목록입니다.

다음과 일치하도록 엔티티 이름과 클래스를 설정했습니다. SCTrack.

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

SCTrack.m : 여기 내 SCTrack.h이다에서 내 VC1.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; 

-(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

CoreData : 오류 :
-(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; 
} 

이은 내가 오류입니다 'SCTrack'

아주 새로운 코어 데이터에 NSManagedObject 클래스의 지정 초기화를 호출하지 못했습니다. 지금 몇 시간 동안 있었어. 나를 올바른 방향으로 가리켜 주셔서 감사합니다.

답변

0

NSManaged 개체의 지정된 초기화 프로그램은 입니다. initWithEntity : insertIntoManagedObjectContext :입니다.

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

아에

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

변경 , 난을 참조하십시오. 감사. 그러나 이것이 VC1에 채워질 모든 SCTrack을 저장하지 않을 것입니까? VC2에만 추가되는 SCTracks를 저장하려고합니다. –

+0

예. NSManaged 객체를 저장하고 싶지 않다면, 왜 그것을 처음부터 초기화하고 있습니까? –

+0

VC1에 표시되도록 초기화 중입니다. VC2에 재생 목록으로 저장하기 위해 그 중 일부 (VC1) 만 선택하려고합니다. 나는 단지 재생 목록을 유지하기를 원한다. 내 VC2에 대한 SCTrack을 나타내는 별도의 CoreData 엔터티 클래스 (SCCoreDataTrack이라고 함)를 만들어서 가능한 솔루션을 찾고 있다고 생각합니다.하지만 확실히 큰 단서를주었습니다. –

관련 문제