UIPickerView 的数据源必须是实现 UIPickerViewDataSource 协议的类。选择器视图的填充是通过以下两种方法完成的:
– numberOfComponentsInPickerView:
– pickerView:numberOfRowsInComponent:
由于 NSArray 没有使用以下协议实现协议:
pickerView.datasource=someArray;
... 生成您所看到的错误,即数组未实现协议。
您需要做的第一件事是声明您的控制器实现协议,如下所示:
@interface MyControllerClass: UIViewController <UIPickerViewDataSource,UIPickerViewDelegate>
那么你需要实现协议的方法,看起来像:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 1; //or whatever
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
return [self.tab_T count]; // assuming just one component
}
要实际填充组件,您需要 UIPickerViewDelegate 方法。(我知道数据源似乎应该提供数据,但由于某种原因,它们倒退了。)
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
return [self.tab_T objectAtIndex:row]; //assuming one component
}
以下关键的想法是实现DataSource和委托方法的对象用作选择器和任何数据结构实际上保存数据之间的接口。在这种情况下,它只是简单的数组,但它可以是任何东西,包括 Core Data、SQL 或从 URL 下载。
pickerview 根本不直接处理数据结构。实现交互的数据源和委托方法始终是对象。