0

我已经在我的核心数据实体上建立了一对多的关系。我正在尝试显示关联数据的详细视图副本。目前我有prepareforseague:与原始实体(例程)一起工作的方法,但是我不知道如何显示链接的实体(例程详细信息)。

在此处输入图像描述

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;

这是我第一次使用核心数据,我正在研究如何显示详细信息实体。我接近让它工作了吗?如果不是,我可以直接看我应该看的东西。

有什么建议么?

4

2 回答 2

0

我想我看到了几个问题——主要与这些不同调用的时间有关。

我相信在调用 prepareForSegue 之前会在您的详细视图上调用 viewDidLoad 。因此,您在 viewDidLoad 中的代码试图在设置之前显示有关您的详细信息项目的数据。

然后 viewDidAppear 中的代码看起来会覆盖您在 prepareForSegue 中设置的值,这对我来说没有意义(尽管此时视图已经显示并且不会影响您尝试在 viewDidLoad 中设置的标签)。

此外,executeFetchRequest: 返回一个 NSArray,而不是 NSManagedObject,因此将 fetch 的结果分配给 NSArray 属性是一个坏主意。

于 2013-07-09T17:10:47.037 回答
0

如果我正确理解您的问题,您希望显示与传入的Routines对象相关的所有RoutinesDetails对象。prepareForSegue

然后,您将在 中声明两个属性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.)

于 2013-07-09T17:12:42.033 回答