UIPickerView с 2 NSMutableArrays? - PullRequest
       26

UIPickerView с 2 NSMutableArrays?

0 голосов
/ 19 января 2010

У меня есть приложение на основе основных данных, над которым я работаю, которое использует EditingViewController для управления рядом различных элементов пользовательского интерфейса, которые получают данные от пользователя, которые описывают атрибуты объекта, который впоследствии сохраняется в моем приложении. Файл EditingViewController.xib содержит такие элементы, как datePicker, textField, numberSlider и где моя проблема исходит из UIPickerView, которые все управляются в одном представлении с помощью выражений .hidden = YES/NO;. Моя проблема в том, что мне нужно заполнить UIPickerView на двух отдельных экранах, которые должны иметь два разных источника NSMutableArray. Внутри моего метода viewDidLoad я установил свой первый NSMutableArray:

listOfItems = [[NSMutableArray alloc] init];
[listOfItems addObject:@"Greenland"];
[listOfItems addObject:@"Switzerland"];
[listOfItems addObject:@"Norway"];
[listOfItems addObject:@"New Zealand"];
[listOfItems addObject:@"Greece"];
[listOfItems addObject:@"Rome"];
[listOfItems addObject:@"Ireland"];

И после этого я заполняю свой UIPickerView * с помощью этого кода:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)picker;
{
    return 1;
}

- (void)pickerView:(UIPickerView *)picker didSelectRow:(NSInteger)row inComponent: (NSInteger)component
{
    label.text= [listOfItems objectAtIndex:row];// The label is simply setup to show where the picker selector is at
}

- (NSInteger)pickerView:(UIPickerView *)picker numberOfRowsInComponent:(NSInteger)component;
{
    return 8;//[listOfItems count];

}

- (NSString *)pickerView:(UIPickerView *)picker titleForRow:(NSInteger)row forComponent: (NSInteger)component;
{
    return [listOfItems objectAtIndex:row];
}

И это прекрасно работает для первого атрибута и массива. Итак, после этого, когда выбран другой uitableviewcell, сборщик скрыт picker.hidden = YES;, и мне нужен другой сборщик, picker2 появляется с другим массивом информации. Но когда я пытаюсь продублировать процесс, настраивая новый сборщик, вызывая его picker2 и пытаясь заполнить его другим массивом NSMutableArray, который я создал рядом с первым (опять же, все потому, что в моем EditingViewController это все часть одного и того же представления, просто вызывая различные элементы пользовательского интерфейса в зависимости от представления) Я не могу заставить picker2 заполнить новый массив. Я не знаю, как настроить его так, чтобы мои два разных массива могли быть заполнены. Нужны ли мне два вида сборщика? Это может быть сделано только с одним? Каков правильный синтаксис в методе - (NSString *)pickerView:(UIPickerView *)picker titleForRow:(NSInteger)row forComponent: (NSInteger)component;, чтобы сделать два массива видимыми по отдельности? Я надеюсь, что кто-то может помочь мне в этом, заранее спасибо!

1 Ответ

3 голосов
/ 19 января 2010

Вы просите использовать один и тот же объект в качестве делегата для двух сборщиков.

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

Например, если вы добавляете свойство для первого средства выбора с именем «pickerOne», а второй изменяемый массив называется «arrayTwo», методы делегата будут выглядеть следующим образом:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)picker;
{
    return 1; // assuming both pickers only have 1 component
}

- (void)pickerView:(UIPickerView *)picker didSelectRow:(NSInteger)row inComponent: (NSInteger)component
{
    // The label is simply setup to show where the picker selector is at
    if (picker == self.pickerOne) {
        label.text= [listOfItems objectAtIndex:row];
    } else {
        label.text= [arrayTwo objectAtIndex:row];
    }
}

- (NSInteger)pickerView:(UIPickerView *)picker numberOfRowsInComponent:(NSInteger)component;
{
    if (picker == self.pickerOne) {
        return [listOfItems count];
    } else {
        return [arrayTwo count];
    }
}

- (NSString *)pickerView:(UIPickerView *)picker titleForRow:(NSInteger)row forComponent: (NSInteger)component;
{
    if (picker == self.pickerOne) {
       return [listOfItems objectAtIndex:row];
    } else {
        return [arrayTwo objectAtIndex:row];
    }
}

Кроме того, вы можете заполнить свой массив следующим образом (если у вас просто статический список строк, массив не должен быть изменяемым):

listOfItems = [[NSArray alloc] initWithObjects:@"Baptisms",@"Greenland",@"Switzerland",@"Norway",@"New Zealand",@"Greece",@"Rome",@"Ireland",nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...