2012-08-09 8 views
2

iPhone 용 앱 (첫 번째 앱)을 개발 중이며 두 개의 UIPickerView를 사용하여 일부 데이터를 표시하려고합니다. 첫 번째 UIPickerView는 자동차 브랜드 목록 (예 : BMW, Mercedes, Ford 등)을 표시합니다. 두 번째 UIPickerView는 첫 번째 UIPickerView에서 선택한 UIPickerViewItem에 따라 모델을 표시합니다.데이터 표시 데이터에 따라 UIPickerView

내가 가지고있는 문제는 UIPickerView를 설정하지 않고 있습니다. 이미 완료되었습니다.

데이터 저장소 (어쩌면 sqlite, 코어 데이터 ... 일종의 일종의 PickerViews를 채울 수있는 방법을 알고 싶습니다. 어떻게 작동하는지 모르겠습니다) 그리고 두 번째 PickerView는 한 번만 채워 져야합니다. 첫 번째 항목을 선택 했으므로 해당 브랜드의 모델 만 표시합니다.) 사전에

감사의 나는 정말지고 있지 않다으로

나는 (나는 보통 웹 - 개발 할 이것은 PHP & MySQL을 ...를 사용하여 매우 쉽게)이 작업을 수행하는 방법, 당신이 이해 바랍니다! 마이크

+0

현재 회원님의 의견을 표시하십시오. .plist를 사용하고 첫 번째 선택을 기반으로 두 번째 선택기보기에 대한 데이터 소스 배열을 설정할 수있는 것처럼 들립니다. – Dustin

+0

버튼을 클릭했을 때 (HTML의 선택 항목으로 사용) 표시되도록 설정된 두 개의 PickerView 만 있고 다른 곳을 클릭하면 숨겨집니다. 하지만 여전히 모든 모델을 같은 배열에 넣을 수 있습니까? 브랜드가 연결된 브랜드를 어떻게 알 수 있습니까? 내 말은 외래 키를 의미합니다 :) 나는 plist에 대해 아주 기본적인 것을 알고 있습니다. – Michael

답변

1

핵심 데이터가 이동하는 길이지만 학습 곡선이 가파릅니다. 당신은 그것을 배우기 위해 꽤 많은 시간을 제쳐 놓아야합니다.

plists로 작업하는 것이 훨씬 쉽고 아마도 충분할 수 있습니다. 이것들은 애플 특유의 XML 파일이며 아주 단순하게 구조화되어있다. Xcode에서 바로 편집 할 수 있으며 형식이 매우 투명합니다.

그러면 plist에서 한 번에 모든 데이터를로드하고 첫 번째 선택 항목에 따라 두 번째 선택 도구를 채울 수 있습니다.

JSON 파일을 사용할 수도 있습니다. 이것들은 훨씬 더 간단하고, 웹 프로그래머로서, 당신은 아마도 그것들에 익숙 할 것입니다.

몇 가지 힌트 :

귀하의 데이터는이 구조를 가져야한다 : 사전의 배열; 각 사전에는 브랜드의 키가 있고 다른 배열의 키는 모델 목록입니다. 이 하위 배열은 이름에 대한 키가있는 사전입니다 (응용 프로그램에서 필요하면 더 많이). 이제

NSString *path = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"]; 
NSArray *data = [NSArray arrayWithContentsOfFile:path]; 

당신이 당신의 브랜드 이름 키를 가정하고이 같은 브랜드 (의 목록을 얻을 수 있습니다 "이름 :

당신은 다음과 같이"Data.plist "라는 PLIST 파일을로드 할 수 있습니다 (JSON은 아날로그입니다) ") :

NSArray *brands = [data valueForKeyPath:@"name"]; 

그리고 브랜드 차종의 목록 :

NSArray *models = [[[data filteredArrayUsingPredicate:[NSPredicate 
    predicateWithFormat:@"name = %@", @"Ford"]] objectAtIndex:0] 
    valueForKey:@"models"]); 

이 첫 번째 파이의 선택에 반응하기 cker보기에서보기 컨트롤러가 선택기보기의 위임자인지 확인하고 pickerView:didSelectRow:inComponent:을 무시하십시오.

을 할당하고 콜백 메소드에서 확인하여 위임 메소드에서 선택기를 구별 할 수 있습니다. 이 도움이

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<array> 
    <dict> 
     <key>name</key> 
     <string>Ford</string> 
     <key>models</key> 
     <array> 
      <string>Mustang</string> 
      <string>Capri</string> 
     </array> 
    </dict> 
    <dict> 
     <key>name</key> 
     <string>VW</string> 
     <key>models</key> 
     <array> 
      <string>Polo</string> 
      <string>Golf</string> 
     </array> 
    </dict> 
</array> 
</plist> 

희망 : 여기

는 PLIST의 strucure의 예입니다.

+0

안녕하세요, 저는 이것이 이것을해야하는 올바른 방법이라고 생각합니다. 그러나 나는 어떻게 내 plist를 구조해야하는지 완전히 모르겠습니다. 정확한 모양을 보여줄 수 있습니까? :) – Michael

+0

템플릿을 게시 해 드리겠습니다. – Mundi

+0

정말 고마워, 정말 도움이 됐어! – Michael

1

원하는 데이터 소스 유형에 따라 다릅니다. 데이터 소스가 정적이고 변경되지 않는다면 앱을 시작할 때마다 만들 수있는 간단한 NSArray 만 있으면됩니다. 귀하의 요구 사항에서 이것은 쉬운 방법이므로 분명히하고 싶은 것처럼 보입니다.

때마다 당신이 당신의 UIPickerController을 만들거나 함께 IBOutlet 경우 바르/속성에이 작업을 수행 : 그들은 모두 대리자에서 동일한 콜백 메소드를 호출되기 때문에

myPicker1.tag = 1; 
myPicker2.tag = 2; 

이/구별 할 수있는 태그를 지정 데이터 소스는 선택기 1의 값 선택에 따라 선택기 2에 조치를 취할 원하기 때문에 그런 (이 경우 귀하의 ViewController)

이 같은 싶지 :

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 

    if (pickerView.tag == 1) { 
     //Means a value just changed on your picker 1!, update datasource for your second picker 
     [myPicker2 reloadComponent:0]; // This will trigger the method - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component method below 
    } 

} 

마지막 피커가 구성 요소를로드 할 필요가있을 때 호출되는 방법 아래 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 방법을 구현하거나,이 경우에도 당신은 reloadComponent

당신은 이런 식으로 뭔가가 필요합니다 호출하는 경우 : 마지막으로

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{ 
    if (pickerView.tag == 2) { 
     //Get appropriate value from the array and return the string for that row 
      MyObject *selectedObject = [myArray objectAtIndex:[pickerActivity selectedRowInComponent:0]]; 
      //Return what you need depending on your needs. 
     } 
} 

을 내가 한 번 봐 것을 권 해드립니다 UIPickerView class reference

희망이 도움이됩니다.

관련 문제