9

私のiPhoneアプリの開発に大きな問題があります。私は2つのcoreDataエンティティ(場所& TimeSpentStudying)を持っているのでCoreData:error:深刻なアプリケーションエラーです。コアデータの変更処理中に例外がキャッチされました

CoreData: error: Serious application error. Exception was caught during Core Data 
change processing. This is usually a bug within an observer of 
NSManagedObjectContextObjectsDidChangeNotification. -[TimeSpentStudying coordinate]: 
unrecognized selector sent to instance 0x21db92d0 with userInfo (null) 

これは奇妙です:

は、ここに完全なエラーです。しかし、私はそれらが問題ではないと思う。 [TimeSpentStudying coordinate]は、私がTimeSpentStudyingコアデータクラスに

を送っcoordinate性質を持っていないので、私はセットアップのMapViewを持っており、ユーザーはmkannotationviewの詳細開示ボタン、新しいビュー(LibraryTrackTimeViewController)ポップでタップしたとき、奇妙ですしかし、ほとんど使用できません。私はviewDidLoadでNSLogを呼び出してみましたが、何も表示されませんでした。

mapViewController.m

#pragma mark - NSNotification 

- (void)contextDidChange:(NSNotification *)notification 
{ 
    if ([self isViewLoaded]) { 
    [self updateLocations]; 
} 

- (void)updateLocations 
{ 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Location" inManagedObjectContext:self.managedObjectContext]; 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:entity]; 

NSError *error; 
NSArray * foundObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
    if (foundObjects == nil) { 
    FATAL_CORE_DATA_ERROR(error); 
    return; 
    } 

    if (locations != nil) { 
    [self.mapView removeAnnotations:locations]; 
    } 

locations = foundObjects; 
[self.mapView addAnnotations:locations]; 

}

-(void)dealloc 
{ 
[[NSNotificationCenter defaultCenter] removeObserver:self 
    name:NSManagedObjectContextObjectsDidChangeNotification 
    object:self.managedObjectContext]; 
} 

は、私が思うにエラーがmapViewController.m

私はラフな構文について謝罪
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if (distance < 500) { 
    if ([segue.identifier isEqualToString:@"TrackLibraryTimes"]) { 
    UINavigationController *navigationController = segue.destinationViewController; 

LibraryTrackTimeViewController *controller = (LibraryTrackTimeViewController *)navigationController.topViewController; 
controller.managedObjectContext = self.managedObjectContext; 
    } 
}} 

にprepareForSegue方法で行う必要があることがあります、私は慣れていますあなたがコードをもっと必要としたら、私に教えてください、ありがとう。

+0

こんにちはようこそ!また、大きな質問! – doge

+3

エラーメッセージは、 'coordinate'メッセージが' TimeSpentStudying'のインスタンス、おそらくアドレス0x21db92d0のオブジェクトに送信されることを明確に示しています。したがって、ある時点では、 'TimeSpentStudying'オブジェクトを使って作業しています。ここでは、別のタイプ(' Locations'?)が必要です。 Objective-Cの動的メソッド解決のために、このような問題は実行時にのみ明らかにされることがよくあります。問題の特定に努めてください。すべてのObjective-C例外にブレークポイントを設定します。 –

答えて

1

プロジェクトの複雑さにもよりますが、この問題を迅速に突き止めるには、問題のある方法を実装し、そこにブレークポイントを設定します。ブレークポイントを押すと、どこに呼び出されたのかを知ることができます。

つまり、あなたのTimeSpentStudyingクラスで

- (CLLocationCoordinate2D)coordinate{ 
    // set a breakpoint on the next line 
    NSParameterAssert(false); 
    return nil; 
} 

のようなものを入れて、それが呼び出される場所を見ることができました。

完了したら削除してください。

-3

私が試してみたいものの一組。

  1. シミュレータからアプリケーションを削除し、アプリケーションを削除してもう一度実行してください。

  2. あなたのコードを見ると、あるコントローラから別のコントローラへmanagedContextObjectを渡していると感じます。その必要はありません。ユーザーAppDelegate sharedInstanceを使用して、いつでもmanagedObjectを取得できます。複数のインスタンスを作成するのではなく、シングルトンオブジェクトです。

これらの2つを試してみてください。いくつか答えが見つかるかもしれないし、修正されているかもしれません。

+1

b/cに投票しても、実際にはCore Dataでそれをやりたいことは決してありません.Appleが推奨する「バトンを渡す」アプローチを使用してMOCを常に回ります。 – bpapa

4

私が代わりにnewIndexPathのindexPathを使用していたため、

-(void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath 

case NSFetchedResultsChangeInsert: 
      //[self.tableView insert 
      NSLog(@"change insert"); 
      [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
      break; 

に、同じエラーが発生しました。

+0

ダグに感謝、あなたは私のベーコンを救った –

2

フェッチされた結果コントローラの割り当てを解除することで問題を解決しました。私は別の画面にオブジェクトを追加/編集していたので、まだフェッチを実行していました。

関連する問題