2014-01-19 39 views
0

也有類似的問題,所以我找不到確切的答案,這將幫助我。我有一個包含兩個實體的練習和圖像的核心數據項目。該應用程序允許用戶將練習添加到SQL數據庫並將其顯示在tableView中。練習名稱,描述和類型等屬性位於練習實體中。兩個圖像在圖像實體中。除了我想要在桌子的每個單元格中放置每個練習的縮略圖以外,一切都很好。我無法弄清楚如何訪問Image實體中的一個圖像。下面是從的tableView實現文件相關的代碼:發生就行cell.imageView.image =錯誤:該實體不是密鑰編碼兼容密鑰 - 核心數據

#import "TableViewController.h" 
#import "AddNewExViewController.h" 
#import "Exercises.h" 
#import "Images.h" 
#import "DetailViewController.h" 

@interface TableViewController() 

@end 

@implementation TableViewController 

@synthesize context, arr; 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     self.title = @"Exercises"; 
} 
    return self; 
} 

- (void)viewWillAppear:(BOOL)animated 
{  
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Exercises"  inManagedObjectContext:context]; 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setFetchBatchSize:20]; 
    [request setEntity:entity]; 
    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
    NSArray *newArray = [NSArray arrayWithObject:sort];  
    [request setSortDescriptors:newArray]; 
    NSError *error; 
    NSMutableArray *results = [[context executeFetchRequest:request error:&error] mutableCopy]; 
    [self setArr:results]; 
    [self.tableView reloadData]; 
} 

#pragma mark - Table view data source 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
    } 

    Exercises *exercises = [arr objectAtIndex:indexPath.row]; 

    cell.textLabel.text = [exercises name]; 
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@, %@, %@", exercises.type, exercises.part, exercises.difficulty]; 
    cell.imageView.image = [UIImage imageWithData:[exercises valueForKey:@"image2"]]; 

    return cell; 
} 

@end 

誤差[UIImage的imageWithData:[練習valueForKey:@ 「圖像2」]]。我明白爲什麼,但我不知道如何解決它。

更新

現在這個問題是固定的,這要歸功於丹雪莉的建議:使用valueForKeyPath而不是valueForKey。我在整個應用程序中更正了這個沒有錯誤但圖像沒有顯示在tableView或單元格中或應用程序中的任何其他位置。我檢查了SQL數據庫,他們在那裏。用戶應該能夠在AddExViewController添加圖像:

AddExViewController.m

- (void) add 
{ 
    NSManagedObjectContext *context = [app managedObjectContext]; 

    Exercises *exercises = [NSEntityDescription insertNewObjectForEntityForName:@"Exercises" inManagedObjectContext:context]; 

    // removed code not relevant for this issue 

    //convert images into NSData 
    NSData *img1 = [NSData dataWithData:UIImageJPEGRepresentation(imageView1.image, 0.5)]; 
    [exercises.self setValue:img1 forKeyPath:@"imgs.image1"]; 

    NSData *img2= [NSData dataWithData:UIImageJPEGRepresentation(imageView2.image, 0.5)]; 
    [exercises.self setValue:img2 forKeyPath:@"imgs.image2"]; 

    [self dismissViewControllerAnimated:YES completion:nil]; 

} 

但圖像不中的tableView細胞顯示,它們也不在DetalViewController顯示其被調用時用戶點擊某行:

DetailViewController.m

- (void) viewWillAppear:(BOOL)animated 
{ 
    //convert images back from NSData back into UIImage 
    UIImage *image1 = [UIImage imageWithData:[exercises valueForKeyPath:@"imgs.image1"]]; 
    [[self imageView1] setImage:image1]; 

    UIImage *image2 = [UIImage imageWithData:[exercises valueForKeyPath:@"imgs.image2"]]; 
    [[self imageView2] setImage:image2]; 

} 

再說一次,當我只使用一個實體時,一切正常。

回答

1

首先,Apple建議將圖像放在單獨的文件中(而不是在CoreData存儲區中)。

第二,因爲現在你的圖像是在自己的實體,您應該更改您的代碼的圖像數據訪問喜歡的東西:

[UIImage imageWithData:[obj valueForKeyPath:@"image2.imageData"]]; 

此外,我會建議此行添加到您的取請求,以便您的UI將運行順暢:

[request setRelationshipKeyPathsForPrefetching:@[@"image2"]]; 

,總之,改變你的VC使用NSFetchedResultsController

相關問題