如何使用两个数据源处理UIPickerView?

时间:2010-06-03 06:44:49

标签: iphone

是否可以在UIPickerView中处理两个数据源?

我这里有一个分段控件,可以控制选择器视图的显示。 因此,例如,当单击第一个段时,选择器将显示人员的姓名。然后,当单击第二个段时,选择器将显示地点的名称。

由于

2 个答案:

答案 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)中检查分段控件的状态,并根据此状态返回必要的值。

当然,您可以创建两个对象(符合必要的协议),只需在段状态更改时重置委托。但我认为这种方式通常更糟糕。