0

如何在 Objective-C 中导航 Core Data 对多关系?

我有一个Event模型,每个实例都有许多EventOccurace通过occurances[原文如此] 关系公开的对象。Apple 的文档说标准属性访问器应该可用,但我不断收到编译时错误:

在此处输入图像描述

DetailViewController.h

@interface DetailViewController : UIViewController <UISplitViewControllerDelegate>
@property (strong, nonatomic) id detailItem;
@end

细节视图控制器.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSSet * foo;

    foo = [[self detailItem] occurances];
    ///No known instance method for selector 'occurances'

    foo = self.detailItem.occurances;
    ///Property 'occurances' not found on object of type 'id'


    //try casting to NSManagedObject to access
    NSManagedObject * casted = (NSManagedObject *)self.detailItem;

    foo = casted.occurances;
    ///Property 'occurances' not found on object of type 'NSManagedObject *'

    foo = [casted occurances];
    ///No visible @interface for 'NSManagedObject' declares the selector 'occurances'
}
4

2 回答 2

1

NSManagedObject要使用(动态创建的)访问器方法,您必须为您的实体创建子类。

这在 Xcode 中很容易完成:在模型编辑器中选择实体,然后从菜单中选择“Editor -> Create NSManagedObject subclass ...”。在源代码中包含头文件(Event.h、EventOccurance.h)。然后

Event *event = self.detailItem;
NSSet *foo = event.occurances;

应该管用。

或者,您可以使用键值编码:

NSSet *foo = [[self detailItem] valueForKey:@"occurances"];

即使没有托管对象子类,它也可以工作。

于 2013-04-02T14:35:12.740 回答
1

一些可能无法正常工作的事情:

首先检查您的 ManagedObject 类是否已生成。

其次,您应该在某处指定 detailItem 的类型。或者在 .h 中,或者通过将其转换为 .m 中的类型。现在它只是一个“id”,编译器无法知道它的类型。

第三,这是访问它的一种可能方式:

NSArray * occurances = [self.detailItem.occurances allObjects];
for(EventOccurance * ocu in occurances){
    //blablabla
}
于 2013-04-02T14:35:42.253 回答