导航与核心数据的多对多关系

时间:2013-04-02 14:21:58

标签: objective-c core-data

如何在Objective-C中导航Core Data to-many关系?

我有一个Event模型,每个实例都有许多通过EventOccurace [原文如此]关系公开的occurances个对象。 Apple的文档说standard property accessor should be available,但我不断收到编译错误:

enter image description here

DetailViewController.h

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

DetailViewController.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'
}

2 个答案:

答案 0 :(得分:1)

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

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

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

应该有用。

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

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

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

答案 1 :(得分:1)

有些事情可能无效:

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

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

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

NSArray * occurances = [self.detailItem.occurances allObjects];
for(EventOccurance * ocu in occurances){
    //blablabla
}