核心数据详细信息视图与关系
我在核心数据实体上建立了一对多的关系 。 我试图显示相关数据的详细视图副本。 目前我有prepareforseague:与原始实体(Routines)合作的方法,但是我对如何显示链接实体(RoutinesDetails)感到很遗憾。
FBCDRoutineViewController
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // Fetch the devices from persistent data store NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Routines"]; self.routines = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; [self.tableView reloadData]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"UpdateDevice"]) { NSManagedObject *selectedDevice = [self.routines objectAtIndex:[[self.tableView indexPathForSelectedRow] row]]; FBCDRoutineViewController *destViewController = segue.destinationViewController; destViewController.routines = selectedDevice; }
FBCDRoutineDetailViewController
- (NSManagedObjectContext *)managedObjectContext { NSManagedObjectContext *context = nil; id delegate = [[UIApplication sharedApplication] delegate]; if ([delegate performSelector:@selector(managedObjectContext)]) { context = [delegate managedObjectContext]; } return context; } - (id)initWithStyle:(UITableViewStyle)style { self = [super initWithStyle:style]; if (self) { // Custom initialization } return self; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // Fetch the devices from persistent data store NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"RoutinesDetails"]; self.routines = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; } - (void)viewDidLoad { [[self navigationController] setNavigationBarHidden:NO animated:YES]; [super viewDidLoad]; // Do any additional setup after loading the view. if (self.routines) { [self.testLabel setText:[self.routines valueForKey:@"routinename"]]; } }
FBCDRoutineDetailViewController
@property (strong) NSManagedObject *routines;
这是我第一次使用核心数据,我正在研究如何显示Details实体。 我接近它的工作吗? 如果没有,我可以直接指向我应该看的东西。
有什么建议么?
如果我正确理解您的问题,您希望显示与prepareForSegue
传递的Routines对象相关的所有RoutinesDetails对象。
然后你将在FBCDRoutineDetailViewController
声明两个属性:
@property (strong) NSManagedObject *routines; // the passed object @property (strong) NSManagedObject *routineDetails; // the displayed details objects
并像这样获取它们:
NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"RoutinesDetails"]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"routineinfo == %@", self.routines]; [fetchRequest setPredicate:predicate]; NSError *error; self.routineDetails = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
self.routineDetails
现在是详细信息视图的数据源数组。
(备注:为了在表视图中显示Core Data请求的结果集,您可能还会考虑使用NSFetchedResultsController
。)
我想我看到了几个问题 – 主要与这些不同电话的时间有关。
我相信在调用prepareForSegue之前会在您的详细信息视图中调用viewDidLoad。 因此,viewDidLoad中的代码在设置之前会尝试显示有关详细信息项的数据。
然后viewDidAppear中的代码看起来要覆盖你在prepareForSegue中设置的值,这对我来说没有意义(虽然此时视图已经显示,并且它不会影响你试图在viewDidLoad中设置的标签)。
此外,executeFetchRequest:返回NSArray,而不是NSManagedObject,因此将获取结果分配给NSArray属性是一个不错的想法。