问题
IF I wanted a picker, for states/provinces, i haven't seen an example, but I mocked up shown above, a picker for US/Can/Mex. wondering can you dynamically switch the NSMutableArray for the UIPickerView and then have it somehow reload each time you click on US/Can/Mex buttons??? How do I go about doing this. What approach do I take. Looking for someone to point a beginner for a clue in the right direction.
回答1:
You will have to implement the datasource and the delegate.
once you press a button, set an array pointer to the appropriate array.
than call [thePicker reloadAllComponents];
-(IBAction) usButtonPressed:(id)sender{
self.inputArray = self.usArray;
[self.thePicker reloadAllComponents];
}
-(IBAction) mexicoButtonPressed:(id)sender{
self.inputArray = self.mexicoArray;
[self.thePicker reloadAllComponents];
}
the datasource methods:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return [self.inputArray count];
}
the delegate methods:
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return [self.inputArray objectAtIndex:row];
}
回答2:
Swift: xcode 6.1
// reload the component of picker (Used this inside the trigger action or button)
self.pickerControl.reloadAllComponents();
回答3:
By calling
thePicker.delegate = self;
again, I was able to force refresh the pickerview with new info
回答4:
In swift 3 in xcode-8 you just write in didSelectRow function like bellow
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
self.view.endEditing(false)
yourPickerView.selectRow(0, inComponent: 0, animated: true)
yourPickerView.reloadAllComponents();
}
回答5:
Use multiple pickers, or use a switch block to determine which data should be loaded, and reload the picker.
回答6:
In your button press action,
[self.pickerView selectRow:0 inComponent:0 animated:YES];
回答7:
Swift 3 & 4
I had the same problem but no solution works,
then i use DispatchQueue it works
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
}
})
来源:https://stackoverflow.com/questions/8598271/how-do-i-reload-refresh-the-uipickerview-with-new-data-array-based-on-button-p