2017-10-08 7 views
0

Objective-Cの学習目的で、コアデータとテーブルビューを持つiOSアプリケーションを作成しました。スクロール後にUITableViewControllerのデータソースオブジェクトがゼロになる

コアデータから「惑星」を読み込み、テーブルビューで表示したいと考えています。コアデータデータベースの惑星は、uiテーブルのデータソースに直接コピーされます。テーブルをスクロールすると、惑星の名前は無限になります。

Planet.h:

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 

@interface Planet : NSManagedObject 
@property (nonatomic, strong) NSString* name; 
@property (nonatomic, strong) NSString* system; 
@end 

Planet.m:

#import "Planet.h" 

@implementation Planet 
@dynamic name; 
@dynamic system; 
@end 

カスタムセル(.H/.M):ビューコントローラで

@interface Cell : UITableViewCell 
@property (nonatomic, strong) IBOutlet UIImageView *imageView; 
@property (nonatomic, strong, retain) IBOutlet UILabel *textLabel; 
@end 

@implementation Cell 
@synthesize imageView; 
@synthesize textLabel; 
@end 

、Iが読み込まコアデータからの惑星

// core data 
AppDelegate *delegate = [[AppDelegate alloc] init]; 
NSPersistentContainer *container = [delegate persistentContainer]; 
NSManagedObjectContext *context = [container viewContext]; 
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName: @"Planet"]; 
NSArray *results = [context executeFetchRequest:request error: nil]; 

tableViewController.dataSource = [NSArray arrayWithArray: results]; 
[tableViewController.tableView reloadData]; 

tableviewcontrollerの実装:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
NSString* cellIdentifier = @"cell"; 

Cell* cell = (Cell*) [tableView dequeueReusableCellWithIdentifier: cellIdentifier]; 

if(cell == nil) { 
    cell = [[Cell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: cellIdentifier]; 
    [cell setSelectionStyle: UITableViewCellSelectionStyleBlue]; 
} 

Planet* planet = (Planet*) dataSource[indexPath.row]; 

if(planet != nil) { 
    NSString *name = [[NSString alloc] init]; 

    if(planet.name != nil) { 
     name = planet.name; 
    } else { 
     name = @"name nil"; 
    } 

    [cell.textLabel setText: name]; 
} else { 
    [cell.textLabel setText: @"planet nil"]; 
} 

[cell.imageView setImage: [UIImage imageNamed: @"planet"]]; 

return cell; 

}

結果が「nilを名」テキストラベルが表示され、スクロールした後に...オブジェクトのプロパティのがnilになっていること、である...と私ドン理由はわかりません...私はNSStringだけのデータソースを埋めると、値は表示されません!

+0

は 'dataSource'が宣言されている方法を示しています。 – rmaddy

+0

データソースの宣言:@property(コピー、非構造)NSMutableArray * dataSource; – Rotzloeffel

答えて

0

解決策を見つけました。オブジェクトをコアデータ(およびコアデータ)から取得(および保存)する方法は間違っていました。コアデータへ

AppDelegate *delegate = (AppDelegate*) [[UIApplication sharedApplication] delegate]; 
NSManagedObjectContext *context = delegate.persistentContainer.viewContext; 
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName: @"Planet"]; 
NSArray *results = [context executeFetchRequest: request error: nil]; 

if([results count] == 0) { 
    dataSource = [[NSMutableArray alloc] init]; 
    for(int i=0;i < [results count];i++) { 
     NSString* name = [results[i] valueForKey: @"name"]; 
     NSString* system = [results[i] valueForKey: @"system"]; 

     [dataSource addObject: [Planet planetWithParameters: name : system]]; 
    } 
} 

書き込みオブジェクト::コア・データからオブジェクトの取得

NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName: @"Planet" inManagedObjectContext: context]; 
[newObject setValue: planets[i] forKey: @"name"]; 
[newObject setValue: systems[i] forKey: @"system"]; 
[delegate saveContext]; 
関連する問題