Ios NSArray上超出范围且摘要错误无效
我正试图创建Dave Mark在iPhone开发书中描述的Ios NSArray上超出范围且摘要错误无效,ios,xcode,nsarray,Ios,Xcode,Nsarray,我正试图创建Dave Mark在iPhone开发书中描述的UIPickerview。我有一个NSArray,它被声明为h文件中的一个属性,该文件将存储UIPickerview的数据。这就是我所拥有的: 在.h文件中: @interface RootViewController : UIViewController { NSArray *dateForPicker; } @property (nonatomic, retain) NSArray *dateforPicker; @end
UIPickerview
。我有一个NSArray
,它被声明为h文件中的一个属性,该文件将存储UIPickerview
的数据。这就是我所拥有的:
在.h文件中:
@interface RootViewController : UIViewController {
NSArray *dateForPicker;
}
@property (nonatomic, retain) NSArray *dateforPicker;
@end
在.m文件viewDidLoad
方法中(我确实在.m文件开头有@synthesis
的dateForPicker
属性):
当出现UIPickerview
时,所有行中都会出现“?”。因此,当我在viewDidLoad
方法中使用断点检查tempArray和dateForPicker的值时,我发现tempArray
很好,但是dateForPicker
从未从tempArray
获取值。Xcode为dateForPicker
数组显示“无效摘要”,并将“超出范围”作为五行的值。发生了什么事?正如书中所描述的,这应该是可行的
以下是UIPickerView的代码:
#pragma mark -
#pragma mark picker data source methods
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 1;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
return [dateforPicker count];
}
#pragma mark picker delegate methods
-(NSString *)pickView:(UIPickerView *)pickerView titleForRow:(NSInteger)row
forComponent:(NSInteger)component{
return [dateforPicker objectAtIndex:row];
}
@end
您的代码有一些问题。我不清楚您是手动在问题中键入了这一点,还是从实际代码中复制粘贴了这一点:
- 您设置的是
,而不是self.dateforPicker
,您的ivar和您的房产之间的资本化存在差异。在iOS中,当您声明属性时,编译器将合成一个self.dateforPicker
ivar,该属性是在dateforPicker
中设置的,但在其他方法中,您可能引用的是从未接触过的viewDidLoad
ivardateforPicker
- 您的
未声明它实现了RootViewController
或UIPickerViewDataSource
协议UIPickerViewDelegate
- 您对
方法的声明是错误的-您的声明以titleForRow
而不是pickView
开始,因此不会被调用pickerView
如果组件中的行数正确(您说的是多个问号,多少?),那么看起来数据源连接正确,但您还需要连接代理,因为这实际上是为每一行提供值的。令人困惑的是,数据源只提供组件的数量和每个组件的行数 发布更多的代码,例如picker调用以及它如何访问dateforPicker ivar。在为dateforPicker赋值后,单步执行代码并在控制台窗口中执行“po self->dateforPicker”。然后类似地检查dateForPicker,当它在picker委托例程中被引用时,或者在任何地方。我在从tempArray中为它分配了值之后,执行了一个po self->dateForPicker。输出为“无法打印NIL对象的描述”。检查UIPickerView出口是否仍然连接(数据源和委托)谢谢!你是对的。这是资本化的原因。我已经解决了资本化问题,UIPickerView提供了一些值。不过,有些奇怪的事情正在发生。当我逐步完成代码并查看tempArray的值时,当我在tempArray上进行鼠标悬停时,调试器会毫无问题地显示6个对象。当我将鼠标移到dateForPicker上时,它仍然显示“无效摘要”,但当我单击箭头时,它会显示6行,每行都有一条注释“无效摘要”。我觉得还是有什么不对劲,以后可能会绊倒我。发生什么事了?
#pragma mark -
#pragma mark picker data source methods
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 1;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
return [dateforPicker count];
}
#pragma mark picker delegate methods
-(NSString *)pickView:(UIPickerView *)pickerView titleForRow:(NSInteger)row
forComponent:(NSInteger)component{
return [dateforPicker objectAtIndex:row];
}
@end