2

私はiPhone用のアプリ(私の最初のアプリ)を開発していますが、2つのUIPickerViewを使用してデータを表示したいと思います。最初のUIPickerViewは、車のブランド(BMW、メルセデス、フォードなど)のリストを表示し、2番目のUIPickerViewは、最初のUIPickerViewで選択したUIPickerViewItemに応じて、モデルを表示します。

私が抱えている問題は、UIPickerViewを設定していないことです。これは、すでに行われています。

ある種のデータストレージ(おそらくsqlite、core-data ...?どちらも機能するかどうかはわかりません)から両方のPickerViewにデータを入力する方法と、最初のPickerViewが選択された後にのみ2番目のPickerViewにデータを入力する方法を知りたいです。アイテムなので、そのブランドのモデルのみが表示されます。

私は実際にこれを行う方法を理解していないので、あなたが理解してくれることを願っています(私は通常、Web開発のみを行い、これはPHPとMySQLを使用して非常に簡単です...);)

前もって感謝します!マイク

4

2 に答える 2

1

要件によっては、必要なデータソースのタイプが異なります。データソースが静的であり、変更されない場合、必要なのは、アプリを起動するたびに作成できる単純なNSArrayだけです。あなたの要件から、これは間違いなくあなたがやりたいことのように見えます、それはより簡単な方法だからです。

UIPickerControllerを作成するとき、またはそれがIBOUTLETである場合は、ivar/propertyに対してこれを実行します。

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

どちらもデリゲート/データソース(この場合はViewController)で同じコールバックメソッドを呼び出すため、タグを割り当てて区別します。

次に、ピッカー1で選択した値に応じて、ピッカー2でアクションを実行するため、次のようにします。

- (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クラスリファレンスを確認することをお勧めします

お役に立てば幸いです。

于 2012-08-09T15:57:07.763 に答える
1

コアデータは進むべき道ですが、学習曲線は急です。あなたはそれを学ぶためにかなりの時間を取っておかなければなりません。

あなたの目的にとってはるかに簡単でおそらく十分なのは、plistを操作することです。これらはApple固有のxmlファイルであり、非常に単純な構造になっています。それらはXcodeで直接編集でき、形式は非常に透過的です。

次に、plistからすべてのデータを一度にロードし、最初の選択に応じて2番目のピッカーにデータを入力できます。

または、JSONファイルを使用することもできます。これらはさらに単純であり、Webプログラマーとして、おそらくそれらに精通しているでしょう。

いくつかのヒント:

データは次の構造である必要があります。辞書の配列。各辞書には、ブランドのキーと、モデルのリストである別の配列のキーがあります。このサブ配列は、名前のキーを持つ辞書です(アプリで必要な場合はさらに多くなります)。

「Data.plist」というplistファイルを次のようにロードできます(JSONはアナログです)。

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

これで、次のようなブランドのリストを取得できます(ブランド名キーが「name」であると想定)。

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

そして、ブランドのメーカーのリスト:

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

最初のピッカービューの選択に反応するには、ビューコントローラーがピッカービューのデリゲートであることを確認し、オーバーライドしますpickerView:didSelectRow:inComponent:

tagsコールバックメソッドでピッカーを割り当ててチェックすることにより、これらのデリゲートメソッドでピッカーを区別できます。

これがあなたのplist構造の例です:

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

お役に立てれば。

于 2012-08-09T16:02:43.227 に答える