Как перезагрузить/обновить UIPickerView (с новым массивом данных) на основе нажатия кнопки?

enter image description here

Если я хотел выбрать сборщик для штатов/провинций, я не видел такого примера, но я сделал макет, показанный выше, сборщик для США/Кан/​​Мекс. интересно, можно ли динамически переключать NSMutableArray для UIPickerView, а затем как-нибудь перезагружать его каждый раз, когда вы нажимаете кнопки US/Can/Mex??? Как мне сделать это? Какой подход я выберу. Ищете кого-то, чтобы указать новичку для подсказки в правильном направлении.

Ответ 1

Вам придется реализовать источник данных и делегат.

как только вы нажмете кнопку, установите указатель массива на соответствующий массив.

чем вызов [thePicker reloadAllComponents];

-(IBAction) usButtonPressed:(id)sender{
    self.inputArray = self.usArray;
    [self.thePicker reloadAllComponents];
}

-(IBAction) mexicoButtonPressed:(id)sender{
    self.inputArray = self.mexicoArray;
    [self.thePicker reloadAllComponents];
}

методы источника данных:

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


- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return [self.inputArray count];
}

методы делегата:

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

Ответ 2

Swift: xcode 6.1

//перезагрузите компонент сборщика (используется внутри действия триггера или кнопки)

self.pickerControl.reloadAllComponents();

Ответ 3

Вызывая

thePicker.delegate = self;

снова, я смог принудительно обновить pickerview с помощью новой информации

Ответ 4

В swift 3 в xcode-8 вы просто пишете функцию didSelectRow, например, ниже.

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {


        self.view.endEditing(false)
        yourPickerView.selectRow(0, inComponent: 0, animated: true)
        yourPickerView.reloadAllComponents();

}

Ответ 5

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

Ответ 6

В вашей кнопке нажмите действие,

[self.pickerView selectRow:0 inComponent:0 animated:YES];

Ответ 7

Свифт 3 и 4

У меня была такая же проблема, но решение не работает,

тогда я использую DispatchQueue это работает

DispatchQueue.main.async(execute: {
        self.picker.delegate = self
        self.picker.dataSource = self
        if self.pickerData.count > 0 {
            self.pickerTextField.text = self.pickerData[0]
            self.pickerTextField.isEnabled = true
        } else {
            self.pickerTextField.text = nil
            self.pickerTextField.isEnabled = false
        }
    })