我有一个具有三个 View 的简单应用 HomeViewController
, AddViewController
, 和 AddCategoryViewController
.
我的数据模型有两个实体,它们之间的关系如下:
我的目标是能够显示 WMDGActivity
HomeViewController
中 TableView 中的对象, 分组在由 WMDGCategory
定义的部分下对象。
新WMDGCategory
对象通过 AddCategoryViewController
中的文本字段添加和新WMDGActivity
对象通过 AddViewController
中的文本字段添加.
我的问题是应用程序在取消或保存任一辅助 View 时崩溃。错误代码总是:
reason: '[<WMDGActivity 0x8a54830> valueForUndefinedKey:]: the entity WMDGActivity is not key value coding-compliant for the key "WMDGCategory".'
每次滚动包含 WMDGCategory 对象名称的选择器轮时,我也会看到这一点:
data: {
activities = "<relationship fault: 0x8db1600 'activities'>";
name = Pastimes;
事实上,另一个谜团是该应用程序显然在崩溃前保存了这些对象。我试过单步执行代码,但还没有想出解决方案。我怀疑我的实体设置方式或与它们交互的代码存在问题。
这是我认为相关的代码:
来自 HomeViewController(代表 AddViewController
和 AddCategoryViewController
:
#pragma mark AddViewControllerDelegate stuff
-(void) addViewControllerDidSave
{
NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
[localContext MR_saveToPersistentStoreAndWait];
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
[self refreshData];
}
-(void) addViewControllerDidCancel:(WMDGActivity *) activityToDelete
{
[activityToDelete MR_deleteEntity];
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
[self refreshData];
}
#pragma mark AddCatControllerDelegate stuff
-(void) addCatControllerDidSave
{
NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
[localContext MR_saveToPersistentStoreAndWait];
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
[self refreshData];
}
-(void) addCatControllerDidCancel:(WMDGCategory *) categoryToDelete
{
[categoryToDelete MR_deleteEntity];
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
[self refreshData];
}
来自 AddCategoryViewController:
- (IBAction)saveButton:(UIBarButtonItem *)sender
{
if (self.catTextField.text.length > 0)
{
self.thisCategory.name = self.catTextField.text;
}
[self.delegate addCatControllerDidSave];
}
- (IBAction)cancelButton:(UIBarButtonItem *)sender
{
[self.delegate addCatControllerDidCancel:self.thisCategory];
}
来自 AddViewController:
- (IBAction)saveButton:(UIBarButtonItem *)sender
{
if (self.activityField.text.length > 0)
{
if (self.categoryLabel.text.length < 1)
{
self.thisCategory.name = @"Uncategorized";
// self.thisActivity.activityName = self.activityField.text;
// [self.delegate addActivityViewControllerDidSave];
}
else
{
self.thisCategory.name = self.categoryLabel.text;
self.thisActivity.name = self.activityField.text;
NSLog(@"Category name is %@", self.thisCategory.name);
NSLog(@"Activity name is %@", self.thisActivity.name);
}
[self.delegate addViewControllerDidSave];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No activity entered"
message:@"Please enter a new activity or Cancel"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
}
- (IBAction)cancelButton:(UIBarButtonItem *)sender
{
[self.delegate addViewControllerDidCancel:self.thisActivity];
}
任何人都可以告诉我我做错了什么吗?
最佳答案
My problem is that the app crashes upon canceling or saving in either of the auxiliary views. The error code is invariably:
查看错误调用堆栈和发生错误的代码会有所帮助。但我会继续进行猜测,即您正在配置一个 NSFetchedResultsController
并将 WMDGCategory
指定为 sectionNameKeyPath
。这有两个问题。首先,关键路径是toCategory
。 WMDGCategory
是数据类型。其次,要按类别名称组织表格 View ,您需要使用关键路径 toCategory.name
。此外,您将需要按 toCategory.name
(NSFetchedResultsController
的要求)对您的事件进行预排序。
I also see this every time I roll the picker wheel containing the names of WMDGCategory objects:
您看到的是 WMDCategory
对象的描述。您需要的是 name 属性的值。您需要使用 [category valueForKey:@"name"]
,或者如果您使用的是便利类,请使用 category.name
。
关于ios - 核心数据关系问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22135267/