2010-06-03 1 views
0

UIPickerView에서 두 개의 데이터 소스를 처리 할 수 ​​있습니까?두 개의 데이터 소스로 UIPickerView를 처리하는 방법은 무엇입니까?

여기에는 피커 뷰의 표시를 제어하는 ​​분할 된 컨트롤이 있습니다. 예를 들어, 첫 번째 세그먼트를 클릭하면 피커가 사람의 이름을 표시합니다. 그런 다음 두 번째 세그먼트를 클릭하면 선택 도구가 장소의 이름을 표시합니다.

감사

답변

1

이 상태에 따라, 당신의 UIPickerView 대표 (UIPickerViewDelegate 및 UIPickerViewDataSource)에서 분할 컨트롤의 상태를 확인하고 필요한 값을 반환 할 수 있습니다.

물론 두 개의 개체 (필요한 프로토콜 준수)를 만들고 세그먼트 상태 변경시 대리자를 다시 설정할 수 있습니다. 그러나 나는이 방법이 일반적으로 더 나쁘다고 생각한다.

+0

감사합니다. –

2

UIPickerView는 한 번에 하나의 데이터 소스 만 가질 수 있습니다. 그러나 사용자가 세그먼트를 변경하면 데이터 소스를 전환 할 수 있습니다. 피커보기의 대리자는 피커의 실제 콘텐츠를 제공하는 대리인이므로 변경해야합니다.

다음은 UIPickerViewDataSource 및 UIPickerViewDelegate를 구현하는 두 개의 개체가있는 예제입니다. titleForRow : 세그먼트 제어를 보면 forComponent

- (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을 가지고 생각 : 컨트롤의 세그먼트 중 하나에 사용자가 클릭 할 때이 방법은 호출된다. 사람과 장소라는 두 개의 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]; 
}
관련 문제