是否可以在UIPickerView中处理两个数据源?
我这里有一个分段控件,可以控制选择器视图的显示。 因此,例如,当单击第一个段时,选择器将显示人员的姓名。然后,当单击第二个段时,选择器将显示地点的名称。
由于
答案 0 :(得分:2)
不直接 - UIPickerView一次只能有一个数据源。但是,您可以在用户更改段时切换数据源。请注意,您还需要更改选择器视图的委托,因为它是提供选择器实际内容的委托。
这是一个示例,其中有两个实现UIPickerViewDataSource和UIPickerViewDelegate的对象。当用户单击控件中的任一段时调用该方法:
- (void)segmentedControlValueChanged { switch (segmentedControl.selectedSegmentIndex) { case 0: pickerView.delegate = personDelegate; pickerView.dataSource = personDelegate; break; case 1: pickerView.delegate = placeDelegate; pickerView.dataSource = placeDelegate; break; default: break; } [pickerView reloadComponent:0]; }
但老实说,我认为更好的解决方案就是让你的pickerView:titleForRow:forComponent查看分段控件。 假设您有两个名为person and places的NSArrays:
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { NSString *result; switch (segmentedControl.selectedSegmentIndex) { case 0: result = [self.persons objectAtIndex:row]; break; case 1: result = [self.places objectAtIndex:row]; break; default: result = @"Error!"; break; } return result; } - (void)segmentedControlValueChanged { [pickerView reloadComponent:0]; }
答案 1 :(得分:1)
您可以在UIPickerView委托(UIPickerViewDelegate和UIPickerViewDataSource)中检查分段控件的状态,并根据此状态返回必要的值。
当然,您可以创建两个对象(符合必要的协议),只需在段状态更改时重置委托。但我认为这种方式通常更糟糕。