2012-11-29 5 views
1

IOS 프로그래밍에 익숙하지 않고 코어 데이터 개념을 익히고 있습니다. Apple 설명서의 지침을 따르십시오. 나는 테이블 뷰 컨트롤러와 가변 배열 인 StocksArray를 속성 중 하나로 갖고있다. 다른 뷰인 DetailedController가 코어 데이터 모델의 엔티티 속성에 대한 사용자 입력을 얻는 데 사용됩니다. NSManagedObject를 DetailedController 개체로 전달하고 대리자를 사용하여 변경 가능한 배열 StocksArray를 업데이트합니다. 컴파일 할 때 오류가 발생했습니다. 'NSInvalidArgumentException'이라는 캐치되지 않은 예외로 인해 응용 프로그램을 종료합니다. 이유 : '* - [NSMutableArray insertObject : atIndex :] : 0'에 개체를 삽입하지 않습니다. 누군가가 나를 도울 수 있다면 정말로 감사 할 것입니다.코어 데이터에 객체 전달하기

#import"StockEntity.h" 
@protocol DetailedControllerdelegate <NSObject> 

-(void)addstockinarray:(StockEntity*)anObject; 

@end 



@interface DetailedController : UIViewController { 

IBOutlet UITextField* stocksymboltextfield; 
IBOutlet UITextField* stocknametextfield; 

//NSManagedObjectContext* context2; 

StockEntity* asinglestock; 

} 
@property (nonatomic, retain) IBOutlet UITextField* stocksymboltextfield; 
@property (nonatomic, retain) IBOutlet UITextField* stocknametextfield; 
//@property(nonatomic, retain) NSManagedObjectContext* context2; 
@property(nonatomic, retain) StockEntity* asinglestock; 
@property (nonatomic, assign) id <DetailedControllerdelegate> delegate; 

@implementation DetailedController 

@synthesize stocksymboltextfield, stocknametextfield,asinglestock, delegate;//context2; 

-(void)onDone:(id)sender{ 
[asinglestock setStockName:self.stocknametextfield.text]; 
[asinglestock setStockSymbol:self.stocksymboltextfield.text]; 

NSLog(@"lets s see: %@", [asinglestock StockName]); 
NSError *error = nil; 

if (![[asinglestock managedObjectContext] save:&error]) { 
    //handle the error 
} 


if ([delegate respondsToSelector:@selector(addstockinarray:)]) { 

    NSLog(@"before delegate"); 

    [delegate addstockinarray:asinglestock]; 

    NSLog(@"am in delegate"); 

} 


[self.navigationController popViewControllerAnimated:YES]; 

} 

그리고 이것은 테이블 뷰

@implementation maintable 

@synthesize stocksArray, managedObjectContext, addButton; 

- (id)initWithStyle:(UITableViewStyle)style { 
self = [super initWithStyle:style]; 
if (self) { 
    // Custom initialization. 

    self.stocksArray =[[NSMutableArray alloc]init]; 
} 
return self; 
} 

- (void)viewDidLoad { 
[super viewDidLoad]; 

//self.stocksArray =[[NSMutableArray alloc]init]; 
self.title = @"Stocks"; 

// Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
self.navigationItem.leftBarButtonItem = self.editButtonItem; 

addButton = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
                 target:self 
                 action:@selector(addStock)]; 
//addButton.enabled = NO; 
self.navigationItem.rightBarButtonItem = addButton; 
} 


-(void) addStock{ 

DetailedController *detail = [[DetailedController alloc]initWithNibName:NSStringFromClass([DetailedController class]) bundle:[NSBundle mainBundle]]; 
//detail.context2 = managedObjectContext; 
StockEntity *stock = (StockEntity*)[NSEntityDescription insertNewObjectForEntityForName:@"StockEntity" 
                   inManagedObjectContext:managedObjectContext]; 

detail.asinglestock = stock; 
detail.delegate = self; 

//[stocksArray insertObject:stock atIndex:0]; 


[self.navigationController pushViewController:detail animated:YES]; 

[detail release]; 



} 

-(void)addstockinarray:(StockEntity*)anObject{ 

if (anObject = NULL) { 
    NSLog(@"YESSS"); 
} 
[self.stocksArray addObject:anObject]; 

NSLog(@"LETTTTTT: %i", [self.stocksArray count]); 

} 




- (void)viewWillAppear:(BOOL)animated { 

[self.tableView reloadData]; 
[super viewWillAppear:animated]; 
} 

답변

1

이 충돌을 처리하기 위해 시도의 구현,

- (void)addstockinarray:(StockEntity*)anObject{ 

    if (anObject) { 
    [self.stocksArray addObject:anObject]; 
    } else { 
    NSLog(@"Object is nil, do the error handling here"); 
    } 

    NSLog(@"LETTTTTT: %i", [self.stocksArray count]); 
} 

귀하의 문제는 당신이에, 전무 값을 삽입하려고하는 것입니다 배열 anObject이 nil 인 이유를 확인하고 거기서 고쳐야합니다. 내가 맞다면 asinglestock은 아무렇지 않게 삽입하려고합니다.