我正在尝试按照Dave Mark的iPhone开发手册中的说明创建UIPickerview
。我有一个NSArray
,它在h文件中声明为属性,该文件将存储UIPickerview
的数据。所以这是我所拥有的:
在.h文件中:
@interface RootViewController : UIViewController {
NSArray *dateForPicker;
}
@property (nonatomic, retain) NSArray *dateforPicker;
@end
在.m文件的
viewDidLoad
方法中(我确实在.m文件的开头具有@synthesize
属性的dateForPicker
):NSArray *tempArray = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
self.dateforPicker = tempArray;
[tempArray release];
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
而不是self.dateForPicker
,因此ivar和属性之间的大小写有所不同。在iOS中,当您声明属性时,编译器将合成一个dateforPicker
ivar,该属性是在viewDidLoad
中设置的,但是在其他方法中,您可能引用的是dateForPicker
ivar,它从未被使用过。
您的RootViewController
没有声明它实现了UIPickerViewDataSource
或UIPickerViewDelegate
协议
您对titleForRow
方法的声明是错误的-您的声明以pickView
而不是pickerView
开头,因此不会被调用。
如果组件中的行数正确(您说了多个问号,有多少个?),那么看来数据源已正确连接,但您还需要连接委托,因为这实际上是在提供每行的值。令人困惑的是,数据源仅提供组件数和每个组件的行数。