Источник данных 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
}
Ключевая идея здесь состоит в том, что объекты, которые реализуют источник данных и методы делегата, служат интерфейсом между средством выбора и любой структурой данных, которая фактически содержит данные. В этом случае это просто простые массивы, но это может быть что угодно, включая Core Data, SQL или загруженные из URL.
Вид сборщика никогда не имеет прямого отношения к структуре данных вообще. Это всегда объект (ы), которые реализуют источник данных и методы делегата, которые выполняют взаимодействие.