我有一个简单的应用,包含三种观看次数HomeViewController
,AddViewController
和AddCategoryViewController
。
我的数据模型有两个实体,关系如下:
我的目标是能够在WMDGActivity
的tableview中显示HomeViewController
个对象,这些对象分组在WMDGCategory
个对象定义的部分下。
通过WMDGCategory
中的文字字段添加新的AddCategoryViewController
个对象,并通过WMDGActivity
中的文字字段添加新的AddViewController
个对象。
我的问题是应用程序在取消或保存任何一个辅助视图时崩溃。错误代码总是:
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];
}
任何人都可以告诉我我做错了吗?
答案 0 :(得分:1)
我的问题是应用程序在取消或保存任何一个辅助视图时崩溃。错误代码总是:
查看错误调用堆栈和发生错误的代码会有所帮助。但我会继续猜测,即您正在配置NSFetchedResultsController
并将WMDGCategory
指定为sectionNameKeyPath
。这有两个问题。首先,关键路径是toCategory
。 WMDGCategory
是数据类型。其次,要按类别名称组织表格视图,您需要使用密钥路径toCategory.name
。此外,您还需要按toCategory.name
(NSFetchedResultsController
的要求)对活动进行预先排序。
每次滚动包含WMDGCategory对象名称的选择器轮时,我也会看到这一点:
您所看到的是WMDCategory
对象的描述。你需要的是name属性的值。您需要使用[category valueForKey:@"name"]
,或者如果您使用便利类category.name
。