13

我在开发我的 iphone 应用程序时遇到了重大问题。

这是完整的错误:

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)

这很奇怪,因为我有两个 coreData 实体( Locations 和 TimeSpentStudying)。但我不认为这些是问题。[TimeSpentStudying coordinate]很奇怪,因为我没有在核心数据类coordinate上发送的属性TimeSpentStudying

我设置了 mapView,当用户点击 mkannotationview 上的详细信息披露按钮时,会弹出一个新视图 (LibraryTrackTimeViewController),但几乎无法使用。我尝试在 viewDidLoad 中调用 NSLog 并没有显示任何内容。

地图视图控制器.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 中的 prepareForSegue 方法有关的错误

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

我为粗略的语法道歉,我刚刚习惯了,如果您需要更多代码,请告诉我,谢谢大家。

4

4 回答 4

8

我有同样的错误,由于

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

我用过indexPath而不是 newIndexPath。

于 2013-12-19T02:38:01.567 回答
2

通过解除分配获取的结果控制器修复了该问题。当我在单独的屏幕中添加/编辑对象时,它仍在执行提取。

于 2016-08-23T18:02:28.967 回答
1

根据项目的复杂性,一个快速的方法是实现有问题的方法并在那里设置断点。当您到达断点时,您可以看到它被调用的位置,并且 Bob 是您的叔叔。

所以你可以把类似的东西

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

在你的TimeSpentStudying课堂上,看看它在哪里被调用。

只要确保完成后将其删除即可。

于 2013-06-20T18:14:53.350 回答
-3

我会尝试几件事。

  1. 从模拟器中删除应用程序并清理应用程序并再次运行。

  2. 查看您的代码,我觉得您正在将 managedContextObject 从一个控制器传递到另一个控制器,无需这样做。用户 AppDelegate sharedInstance 可以随时获取 managedObject。它不会创建多个实例,它是一个单例对象。

试试这两个,希望你能找到一些答案或者修复它。

于 2013-06-20T18:20:21.253 回答