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:;然后你走 NSArray 直到你找到你想要的 NSDictionary。

您正在使用[[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 回答