2012-08-09 99 views
2

我正在爲iPhone開發一個應用程序(我的第一個應用程序),我想使用兩個UIPickerView來顯示一些數據。第一個UIPickerView將顯示汽車品牌列表(例如BMW,Mercedes,Ford等)。第二個UIPickerView將顯示模型,具體取決於您在第一個UIPickerView中選擇的UIPickerViewItem。根據數據顯示數據UIPickerView

我的問題是沒有設置UIPickerView,這已經完成了。

我想知道如何從某種數據存儲中填充PickerViews(也許sqlite,core-data ...?不知道如何工作,雖然),而且,第二個PickerView應該只填充一次第一個選擇了一個項目,所以它只顯示該品牌的型號。

我希望你能理解,因爲我真的沒有得到我如何做到這一點(我通常只做網絡的發展,這一點使用PHP MySQL的& ......是非常容易);)

感謝的提前! Mike

+0

顯示你目前有什麼。這聽起來像你可以使用.plist,並根據你的第一個選擇設置第二個選擇器視圖的數據源數組。 – Dustin 2012-08-09 15:49:59

+0

我只有兩個PickerViews被設置爲單擊按鈕時顯示(作爲HTML中的選擇),當您在其他地方單擊時,它被隱藏。但是我仍然可以將所有模型放在同一個陣列中嗎?我如何知道它連接的品牌?我的意思是像一個外鍵或如此:)我知道非常基本plist的,所以如果這是我可以使用的,那會很棒! – Michael 2012-08-09 15:55:42

回答

1

核心數據是要走的路,但學習曲線陡峭。你應該花一些時間來學習它。

爲了您的目的,更容易,也許足夠的是與plists合作。這些是蘋果特定的XML文件,結構非常簡單。你可以在Xcode中編輯它們,格式非常透明。

然後,您可以從plist中一次加載所有數據,並根據第一個選項填充第二個選擇器。

或者,您可以使用JSON文件。這些更簡單,作爲一個網絡程序員,你可能對這些很熟悉。

一些提示:

你的數據應該有這樣的結構:字典的數組;每個字典都有一個關鍵品牌和一個另一個陣列,一個模型列表。這個子數組是一個帶有名字鍵的字典(如果你在你的應用程序中需要它,也許更多)。

您可以載入名爲「Data.plist」像這樣的plist文件(JSON是模擬):

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

現在,你可以得到這樣的品牌(假設你的品牌名稱關鍵字的列表是「名「):

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

而對於一個品牌的品牌名單:

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

反應到選擇的第一圓周率cker視圖,請確保您的視圖控制器是選取器視圖的代表並覆蓋pickerView:didSelectRow:inComponent:

您可以通過分配tags並在回調方法中檢查它們來區分這些委託方法中的選擇器。

這是你的plist strucure的例子:

<?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> 

希望這有助於。

+0

嗨,我相信這是我應該這樣做的正確方式,但我不完全確定我應該如何構建我的plist。 你能給我一個它應該看起來完全如何的例子嗎? :) – Michael 2012-08-09 16:22:50

+0

我會爲你發佈一個模板。 – Mundi 2012-08-09 16:24:01

+0

非常感謝,這確實有幫助! – Michael 2012-08-09 16:36:52

1

這取決於您的要求,您需要的數據源的類型。如果你的數據源是靜態的,並且永遠不會改變,那麼你所需要的只是一個簡單的NSArray,你可以在每次啓動你的應用時創建它。從您的要求看,這絕對是您想要做的,因爲它是更簡單的方法。

只要你創建你的UIPickerController或者如果它是一個IBOutlet這樣對伊娃/屬性:

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

指定一個標記來區分他們,因爲他們將是既調用您的委託同一回調方法/數據源(你在這種情況下的ViewController)

那麼既然你想採取行動的選擇器2根據在選擇器1的值選擇你想要的東西是這樣的:

- (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

希望有幫助。