3

赤ワインに関する情報を表示する iPhone アプリを作成しています。ワインは、辞書の配列を含む plist に保存されます。アプリケーションに検索ビュー コントローラーを追加しています。簡単に起動するために、"Name" キーの値にnameString (テキスト ボックスから)が含まれるワインを取得したいと考えています。

ここで終わりです。これを行う最も適切な方法についてアドバイスが必要です。NSArray クラスに機能があり、NSPredicate、NSUserDefaults を取り込む必要がありますか、それとも他のオプションがありますか? 私はいくつかの調査を行いましたが、開始するにはいくつかのアドバイスと例が必要になるでしょう。

ユーザーが国を含めたり除外したり、この料理とあの料理に合うワインを入手したり、最低価格、最高価格を設定したりできるように検索機能を拡張します。辞書には、このすべての情報の文字列があります。したがって、このような高度な作業を開始する前に、どの関数が私の仕事を最も効果的に実行できるかについてのアドバイスが必要です。

-(IBAction)searchButtonPoke:(id)sender{

    NSString *path = [[NSBundle mainBundle] pathForResource:@"Wines" ofType:@"plist"];
    allObjectsArray = [[NSMutableArray alloc] initWithContentsOfFile:path];

    NSString *nameString = [NSString stringWithFormat:@"%@", [nameTextField text]];

    resultObjectsArray = /*objects where the value for the key "Name" contains
                                                                   nameString*/;
4

4 に答える 4

10

単純に配列を反復処理して名前を比較するのはどうですか?

resultObjectsArray = [NSMutableArray array];
for(NSDictionary *wine in allObjectsArray)
{
   NSString *wineName = [wine objectForKey:@"Name"];
   NSRange range = [wineName rangeOfString:nameString options:NSCaseInsensitiveSearch];
   if(range.location != NSNotFound)
     [resultObjectsArray addObject:wine];
}

Swift バージョンはさらにシンプルです。

let resultObjectsArray = allObjectsArray.filter{
    ($0["Name"] as! String).range(of: nameString,
                                  options: .caseInsensitive,
                                  range: nil,
                                  locale: nil) != nil
}

乾杯、アンカ

于 2012-07-31T00:05:27.080 に答える