我遇到了开发我的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,但没有显示任何内容。
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中的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;
}
}}
我为粗略的语法道歉,我只是习惯了,如果你需要更多的代码,请告诉我,谢谢所有。
答案 0 :(得分:7)
由于
,我遇到了同样的错误-(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。
答案 1 :(得分:2)
通过取消分配获取的结果控制器来解决此问题。当我在单独的屏幕中添加/编辑对象时,它仍在执行提取。
答案 2 :(得分:1)
根据项目的复杂程度,快速捕捉到这种情况的方法是实施违规方法并在那里设置断点。当你点击断点时,你可以看到它被调用的地方,鲍勃是你的叔叔。
所以你可以放点像
- (CLLocationCoordinate2D)coordinate{
// set a breakpoint on the next line
NSParameterAssert(false);
return nil;
}
在你的TimeSpentStudying
课程中,看看它被调用的地方。
确保在完成后将其删除。
答案 3 :(得分:-3)
我会尝试的事情。
从模拟器中删除应用程序并清理应用程序并再次运行。
查看您的代码,我觉得您正在将managedContextObject从一个控制器传递到另一个控制器,而不需要这样做。用户AppDelegate sharedInstance可随时获取managedObject。它不会创建多个实例,它是一个单例对象。
试试这两个,希望你可能会找到答案,或者可以解决它。