Как добавить несколько компонентов в PickerView? - PullRequest
2 голосов
/ 27 сентября 2010

Это может быть простой вопрос, но как мне добавить несколько компонентов в UIPickerView?Я использую NSMutableArray для заполнения одного компонента, но я не знаю, как заполнить другие.Мне также нужно изменить значение метки при выборе строки.Заранее спасибо Киран

Ответы [ 5 ]

10 голосов
/ 10 августа 2012

Я так понимаю, что вы новичок. Вот как реализовать методы, на которые правильно указал nacho:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    // return the number of components required
    return 2;
}

Вы можете использовать другие NSMutableArray для заполнения компонентов. Предполагая, что у вас есть 2 компонента, каждый из которых использует разные NSMutableArray, т.е. array1 и array2:

// Return row count for each of the components
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    if (component == 0) {
        return [array1 count];
    }
    else {
        return [array2 count];
    }
}

// Populate the rows of the Picker
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {

    // Component 0 should load the array1 values, Component 1 will have the array2 values
    if (component == 0) {
        return [array1 objectAtIndex:row];
    }
    else if (component == 1) {
        return [array2 objectAtIndex:row];
    }
    return nil;
}

Используйте этот код для изменения текста label, скажем, selectedValue, когда значение выбрано в PickerView:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    selectedValue.text = [NSString stringWithFormat: @"%@, %@", [array1 objectAtIndex:[myPicker selectedRowInComponent:0]],[array2 objectAtIndex:[myPicker selectedRowInComponent:1]]];
}

... и тебе пора :))

Вы также можете обратиться к http://joshhighland.com/blog/2009/09/17/uipickerview-spinning-multiple-components/ за полезными советами по программированию pickerView.

2 голосов
/ 27 сентября 2010

Вам нужно установить источник данных и использовать

– numberOfComponentsInPickerView:
– pickerView:numberOfRowsInComponent:

установите его делегат и используйте:

– pickerView:didSelectRow:inComponent:

чтобы изменить метку, когда выбрана определенная строка в определенном компоненте. Очень вероятно UITableViewDelegate и Datasource

, а также взгляните на документацию помогает:)

1 голос
/ 28 марта 2018

Вот код swift3. Здесь я присваиваю значения множественного представления для UITextField.

var pickOption = [["1", "2", "3","4","5","6","7","8","9"], ["0","1","2", "3","4","5","6"],["0","1","2", "3","4","5","6"]]
@IBOutlet weak var travellersTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    let pickerView = UIPickerView()
    pickerView.delegate = self
    travellersTextField.inputView = pickerView
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return pickOption.count
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickOption[component].count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return  pickOption[component][row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    let adult = pickOption[0][pickerView.selectedRow(inComponent: 0)]
    let child = pickOption[1][pickerView.selectedRow(inComponent: 1)]
    let infant = pickOption[2][pickerView.selectedRow(inComponent: 2)]

    travellersTextField.text = adult + " adults," + child + " children," + infant + " infants"
    travellersTextField.becomeFirstResponder()

}
1 голос
/ 17 января 2017

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

- (void) viewDidLoad {
  horPickerArray = @[@"00",@"01",@"02",@"03",@"04",@"05".to..24];
  minPickerArray = @[@"00",@"01",@"02",@"03",@"04",@"05".to..59];
  secPickerArray = @[@"00",@"01",@"02",@"03",@"04",@"05".to..59];
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 3;   
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if (component == 0) {
        return _HorPickerArray.count ;
    }
    else if (component == 1) {
        return _MinPickerArray.count ;
    }
    else if (component == 2) {
        return _SecPickerArray.count ;
    }
}

 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if (component == 0) {
        return [_HorPickerArray objectAtIndex:row];
    }
    else if (component == 1) {
        return [_MinPickerArray objectAtIndex:row];
    }
    else if (component == 2) {
        return [_SecPickerArray objectAtIndex:row];
    }
    return nil;

}

И напечатать в TextField

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{

    _OficialTime.text  =[NSString stringWithFormat: @"%@:%@:%@",    [_HorPickerArray objectAtIndex:[_TimerPiker selectedRowInComponent:0]],[_MinPickerArray objectAtIndex:[_TimerPiker selectedRowInComponent:1]],  [_SecPickerArray objectAtIndex:[_TimerPiker selectedRowInComponent:2]]]; 
}
1 голос
/ 03 января 2014

Вместо component я нашел использование tag более подходящим.

enter image description here

Тогда в коде:

// returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    //NSLog(@"Component_1: %d",pickerView.tag);
    if (pickerView.tag == 1)
        return [self.arrOpponentTeams count];
    else if (pickerView.tag == 2)
        return [self.arrMyTeams count];
    else
        return [self.arrPlayers count];
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    //NSLog(@"Component_2: %d",pickerView.tag);
    if( pickerView.tag == 1 )
        return [self.arrOpponentTeams objectAtIndex:row];
    else if (pickerView.tag == 2)
        return [self.arrMyTeams objectAtIndex:row];
    else
        return [self.arrPlayers objectAtIndex:row];
}
...