Ios 创建核心数据对象时视图控制器崩溃
我有一个视图控制器,当用户请求将对象添加到数据库时会触发该控制器。该视图具有文本输入字段和UIPICKERVIEW。在我添加一个NSMANAGEDOBJECT来存储输入的数据之前,视图一直加载并正常工作 头文件:Ios 创建核心数据对象时视图控制器崩溃,ios,core-data,uipickerview,Ios,Core Data,Uipickerview,我有一个视图控制器,当用户请求将对象添加到数据库时会触发该控制器。该视图具有文本输入字段和UIPICKERVIEW。在我添加一个NSMANAGEDOBJECT来存储输入的数据之前,视图一直加载并正常工作 头文件: `@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;` `@property (strong, nonatomic) Training *trainingEvent;`
`@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;`
`@property (strong, nonatomic) Training *trainingEvent;`
`@property (retain, nonatomic) NSArray *eventTypes;`
还有.m
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.typePicker = [[UIPickerView alloc] init];
if (self.managedObjectContext) {
NSLog(@"managed object context loaded");
} else {
NSLog(@"no managed object context loaded");
}
NSLog(@"event types loaded :%lu", (long unsigned)self.eventTypes.count);
if (self.trainingEvent) {
NSLog(@"training event loaded %@", self.trainingEvent.name);
} else {
//create new event in MOC
NSLog(@"create new training event");
NSEntityDescription *trainingEntityDescription = [NSEntityDescription entityForName:@"Training"
inManagedObjectContext:self.managedObjectContext];
Training *newTrainingEvent = (Training *)[[NSManagedObject alloc] initWithEntity:trainingEntityDescription
insertIntoManagedObjectContext:self.managedObjectContext];
self.trainingEvent = newTrainingEvent;
}
}
当我注释掉else条款时,(在MOC中创建新事件)
风景不错。但正如我写的那样,我得到了以下错误:
`*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array'`
附加的UIPICKER方法:
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
//cell.textLabel.text = [arrWebServiceList count] > 0 ? [arrWebServiceList objectAtIndex:indexPath.row] : @"DummyText";
NSLog(@"titleForRow %lu", (long)row);
return [self.eventTypes objectAtIndex:row];
}
-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
UILabel *tView = (UILabel *)view;
NSLog(@"viewForRow %lu", (long)row);
if (!tView) {
tView = [[UILabel alloc] init];
tView.minimumScaleFactor = 0.5;
[tView setFont:[UIFont systemFontOfSize:12.0]];
tView.numberOfLines = 4;
tView.lineBreakMode = NSLineBreakByWordWrapping;
}
tView.text = [self.eventTypes objectAtIndex:row];
return tView;
}
问题:如何创建一个核心数据对象来存储数据?以何种方式该
else
子句不起作用?你说过当你把它注释掉时会发生什么,但是当你把它放进去时会发生什么呢?当我把它放进去时,应用程序崩溃,错误索引0超出了空数组的界限。
唯一的数组是self.eventTypes,我知道它在viewDidLoad末尾不是空的。你怎么知道它不是空的?您在哪里为它分配一些内容?在离开viewDidLoad之前,我记录self.eventType.count并获取21个对象。该数组由prepareForSegue中的上一个视图加载。另外,当我注释掉else子句时,数组在处理了一整天之后被完全填充,它所查看的数组是核心数据对象的数组,它是空的,因为我还没有保存任何数据对象。我看不出它在看那个阵列。