我正在尝试按照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没有声明它实现了UIPickerViewDataSourceUIPickerViewDelegate协议
您对titleForRow方法的声明是错误的-您的声明以pickView而不是pickerView开头,因此不会被调用。


如果组件中的行数正确(您说了多个问号,有多少个?),那么看来数据源已正确连接,但您还需要连接委托,因为这实际上是在提供每行的值。令人困惑的是,数据源仅提供组件数和每个组件的行数。

08-16 01:16