1

誰かが私を助けてくれることを願っています。私は iOS アプリ開発に非常に慣れていないので、実際に地元の学校でのキャリア デイ イベントのために何かをまとめようとしています。

その背景には、データを正確に処理して入力する学生の能力をテストできるようにしたいということがあります。

これをテストするには、iPad にアプリを展開して、日中に試してもらいたいと考えています。とてもシンプルなもの(と思います!)

これまでのところ、アプリを作成し、入力ボックスを配置してすべてリンクする方法を知っており、ボックスへの入力が次のようなコードでハードコードされた値に対して正しいことをテストする方法を考え出しました。

  self.DealID = self.DealIDEntry.text;
    NSString *Check1 = @"No";
    NSString *DealIDString = self.DealID;
    if ([DealIDString length] == 0) {
        Check1 = @"No Deal ID Entered";
    }
    if([self.DealID isEqual: @"12345678"]) {
        Check1 = @"Yes";
    }
    self.DealIDCheck.text = Check1;

私が欲しいのは、可能なDealIDのテーブルをそれぞれに5〜6ビットの関連データ(顧客、通貨など)を用意し、学生が取引IDを入力すると、うまくいけば正しい顧客、通貨などになることです。アプリは、plist 内の DealID の「ルックアップ」を実行し、顧客の値がその DealID に対して正しいことを確認することによって確認する必要があります。

私は辞書を使ってこれをやろうとしました:

NSBundle *bundle = [NSBundle mainBundle];
NSString *pListpath = [bundle pathForResource:@"TestTable" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:pListpath];



self.CustomerName = self.CustomerNameEntry.text;
    NSString *Check2 = @"No";
    NSDictionary *DealID = [dict valueForKey:self.DealID];
    NSString *CustomerNameString = self.CustomerName;
    if ([CustomerNameString length] == 0) {
        Check2 = @"No Customer Name Entered";
    }
    if([self.CustomerName isEqual: [DealID objectForKey:@"CustomerName"]]) {
        Check2 = @"Yes";
    }
    self.CustomerNameCheck.text = Check2;

悲しいことに、それは機能していません。plist を正しくロードする (またはロードされているかどうかをテストする) 方法がわからないか、単に間違ったことをしただけだと思います!

編集 2 - 以下の Matt のヘルプのおかげで、このコードを使用して plist をディレクトリのディレクトリとしてロードし、特定のサブディレクトリに関連するオブジェクトをクエリできます。ありがとう、マット!

//This loads the array of data
    NSBundle* bundle = [NSBundle mainBundle];
    NSString* plistPath = [bundle pathForResource:@"TestTable" ofType:@"plist"];
    //Make large Dictionary
    NSDictionary *TradeTable = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
    NSLog(@"The count: %i", [TradeTable count]);
    //Create relevant sub directory
    NSDictionary *query = [TradeTable valueForKey:@"12345678"];
    NSLog(@"The count: %i", [query count]);
    //Query that subdirectory for the object in question
    NSString *name = [query objectForKey:@"CustomerName"];
    NSLog(name);

興味のある人のために、私の plist は次のようになります。

<dict>
    <key>12345678</key>
    <dict>
        <key>CustomerID</key>
        <integer>98765</integer>
        <key>CustomerName</key>
        <string>BigBank</string>
        <key>CustomerBank</key>
        <string>LittleBank</string>
        <key>AmountinCCY</key>
        <integer>75000</integer>
        <key>CCY</key>
        <string>GBP</string>
        <key>AmountinUSD</key>
        <integer>115000</integer>
        <key>Date</key>
        <integer>1</integer>
        <key>Points</key>
        <integer>5</integer>
    </dict>
    <key>12345679</key>
    <dict>
        <key>CustomerID</key>
        <integer>98754</integer>
        <key>CustomerName</key>
        <string>CarShop</string>
        <key>CustomerBank</key>
        <string>BigBank</string>
        <key>AmountinCCY</key>
        <integer>25123</integer>
        <key>CCY</key>
        <string>EUR</string>
        <key>AmountinUSD</key>
        <integer>27000</integer>
        <key>Date</key>
        <integer>0</integer>
        <key>Points</key>
        <integer>4</integer>
    </dict>
</dict>
</plist>

できるだけ多くの情報を提供したかっただけです。

誰の助けにも感謝します。フィル

4

1 に答える 1

0

表示した plist は、NSDictionary オブジェクトの NSArray としてロードされます。したがって、 NSArray でロードしarrayWithContentsOfFile:ます。次に、必要な NSDictionary が見つかるまで NSArray を調べます。

を使用していますが、これは辞書ではなく[[NSDictionary alloc] initWithContentsOfFile:pListpath]配列であるため、結果 (your dict) は nil です。ドキュメントはこれを正確に予測します:initWithContentsOfFile:

戻り値: 初期化されたディクショナリ...ファイルの内容がディクショナリの無効な表現である場合は nil。

(イタリック体)

さて、それはあなたの問題です。ファイルの内容は、実際には配列の有効な表現であるため、ディクショナリの無効な表現です。

ここで、辞書の配列がデータを格納する最良の方法であると言っているわけではありません。ディクショナリのディクショナリの方がはるかに優れていたと思います (DealID などのマスター キーによって、適切なサブディクショナリをすぐに取得できるため)。しかし、何らかの理由で、それはデータの保存方法ではありません。配列として保存したので、配列として取得する必要があります。

編集: 私が提案しているのは、取引 ID の値をサブディクショナリのキーとして使用することです。このような:

Dictionary
    key: 12345678
    value: a whole nother dictionary with everything *else* about that answer
    ---
    key: 12345679
    value: a whole nother dictionary with everything *else* about that answer
    ---
    etc.

したがって、辞書の大きな辞書 ( d) から開始するとd[someDealId]、正しいサブ辞書 ( ) になり、キーによってその他の値subdを取得できるようになります。subd[@"customerName"]これは、まさにあなたが説明していた「ルックアップ」のようなものだと私には思えます。

于 2013-04-02T19:14:03.977 に答える