2013-07-09 35 views
0

我在我的核心數據實體上設置了一個1對多關係。我正試圖顯示關聯數據的detailview副本。目前我有與原始實體(例程)一起工作的prepareforseague:方法,但是我對如何顯示鏈接實體(RoutinesDetails)感到迷茫。核心數據詳細信息查看關係

enter image description here

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實體。我接近完成它的工作?如果沒有,我可以指示我應該看的東西。

有什麼建議嗎?

回答

0

如果我理解你的問題正確,要顯示所有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現在是數據源陣列的詳細信息視圖。

(備註:用於顯示結果集的表視圖核心數據請求, 您也可以考慮使用NSFetchedResultsController

+0

所以我現在需要做的就是建立表格視圖?將使用NSfetchedResultscontroller是一個更好的選擇? – Sgillon

+0

@ user2221799:NSFetchedResultsController的優點在於,它具有在插入,刪除或修改對象時自動更新表視圖的方法。如果你不需要,你可以執行獲取請求並在表格視圖中顯示'self.routineDetails'數組。 –

+0

我確實認爲我更喜歡使用NSFetchResultsController。涉及公平的一點或重寫不是嗎?對不起,所有問題 – Sgillon

0

我想我看到幾個問題 - 主要與這些不同的調用的時間有關。

我相信viewDidLoad是在prepareForSegue被調用之前在你的詳細視圖上調用的。因此,viewDidLoad中的代碼正試圖在設置之前顯示有關您的明細項目的數據。

然後,viewDidAppear中的代碼看起來是覆蓋了您在prepareForSegue中設置的值,這對我沒有意義(儘管此時視圖已經顯示,並且不會影響您嘗試設置的標籤在viewDidLoad中)。

此外,executeFetchRequest:返回一個NSArray,而不是一個NSManagedObject,因此將您的獲取結果分配給您的NSArray屬性是一個壞主意。

+0

'prepareForSegue'之前'viewDidLoad'據我所知叫。但是你認爲在'viewWillAppear'中覆蓋'self.routines'沒有任何意義。 –