один сборщик, несколько массивов для источников данных - работает нормально, но как? - PullRequest
0 голосов
/ 03 июня 2010

У меня есть класс с 4 массивами: tab_1, tab_2, tab_3 и tab_T. Я установил делегат и источник данных сборщика на себя (это класс, содержащий массивы).

Средство выбора вызывается, когда текстовые поля начинают редактирование. Я возвращаю НЕТ, чтобы не показывать клавиатуру. Вместо этого у меня есть метод, анимирующий сборщик.

В зависимости от того, какое текстовое поле затрагивается, я делаю: tab_T = tab_1; или 2 или 3

По моему мнению, это назначение делает tab_T источником данных выбора. Действительно ли это назначение связывает массив tab_T с источником данных? Есть ли способ назначить его вручную? Я уверен, что есть. Но picker.datasource = tab_1 не работает. я получил «предупреждение: класс« NSMutableArray »не реализует протокол« UIPickerViewDataSource »».

Это мое первое приложение, может быть, я забыл шаг, который я сделал в раннем возрасте моего приложения.

С нетерпением жду тех, кто хочет помочь.

Wallou

1 Ответ

2 голосов
/ 03 июня 2010

Источник данных 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.

Вид сборщика никогда не имеет прямого отношения к структуре данных вообще. Это всегда объект (ы), которые реализуют источник данных и методы делегата, которые выполняют взаимодействие.

...