我可以用数字表示NSDictionary项目吗?

时间:2010-05-12 10:14:39

标签: iphone objective-c plist nsdictionary

我正在尝试设置一个充当表单的UITableView。每个单元格中都有一个UILabel和一个UITextField,因此一个单元格是:

Name          <enter name>
^             ^
UILabel       UITextField

现在,我正在尝试从NSDictionary(来自plist)填充UILabel和UITextField,它的组织如下:

Root            Type           Value
  Name          String
  Address       String
  City          String

  etc

但是为了在cellForRowAtIndexPath方法中获得正确的标签和文本字段,我必须以数字方式引用字典。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:4)

不,因为NSDictionary中的元素没有排序。

您应该使用数组作为表视图数据源背后的模型。您可以轻松地为您的案例构建一个:

NSArray* myArray = [myDict allKeys];

当然,对于您的情况,需要特殊订单。所以你宁愿使用文字构建你的数组:

NSArray* myArray = [NSArray arrayWithObjects:@"Name", @"Address", @"City", nil];

答案 1 :(得分:2)

严格来说,没有。

我倾向于创建一个单独的NSArray密钥,这些密钥按顺序排列,以便按顺序排列。例如:

NSDictionary *values = ...
NSArray *keys = ....

for (NSString *key in keys) {
    id value = [values objectForKey:key];
    ...
}

正如其他人所指出的那样,有必要使用有序列表(即NSArray)来匹配UITableView的工作方式。但是,这不一定是数据本身。当数据是NSDictionary或NSManagedObject时,在表单中编辑数据有一个常见的习惯用法,在iPhoneOS上几乎总是表示UITableView

在这种情况下,您可能不希望显示已编辑对象中的所有元素,您将希望显示字段的标题,并希望控制显示的顺序。所有这些都意味着这是一种有效(未混淆)的情况模式。

在这种特殊情况下,密钥可以从plist中获取,但是以一般方式提取它们虽然通过解析plist XML是可行的,但这并非易事。

答案 2 :(得分:2)

你应该将你的plist重组为一系列词典。字典键是您需要填充的元素和文本的值。按照希望它在屏幕上显示的顺序将每个字典添加到plist数组中。这实际上是Settings应用程序的工作方式。保存用户输入的文本非常简单。

你的plist看起来像:

<root>
    <array>
        <dict>
            <key>labelText</key>
            <value>Name</value>
            <key>textFieldPromptText</key>
            <value>enter name</value>
            <key>textFieldText</key>
            <value>name entered by user</value>
        </dict> 
        <dict>
            <key>labelText</key>
            <value>Address</value>
            <key>textFieldPromptText</key>
            <value>enter street address</value>
            <key>textFieldText</key>
            <value>address entered by user</value>
        </dict>
        <dict>
            <key>labelText</key>
            <value>City</value>
            <key>textFieldPromptText</key>
            <value>enter city</value>
            <key>textFieldText</key>
            <value>city entered by user</value>
        </dict> 
        .
        .
        .
    </array>
</root>