如何在Objective-C中导航Core Data to-many关系?
我有一个Event
模型,每个实例都有许多通过EventOccurace
[原文如此]关系公开的occurances
个对象。 Apple的文档说standard property accessor should be available,但我不断收到编译错误:
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'
}
答案 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
}