【问题标题】:Writing plist with Dictionary format用字典格式编写 plist
【发布时间】:2012-06-24 07:49:20
【问题描述】:

我正在将信息写入文档文件夹中的 plist 文件,并且我已经完成了大约 90% 的路径(我认为)。我只是需要一些帮助来格式化我正确编写的信息。

我需要以这种格式写入数据:

<plist version="1.0">
<array>
<dict>
    <key>Level</key>
    <string>0</string>
    <key>Top</key>
    <string>0</string>
    <key>Needed</key>
    <string>0</string>
    <key>Passed</key>
    <string>0</string>
</dict>
<dict>
    <key>Level</key>
    <string>1</string>
    <key>Top</key>
    <string>5300</string>
    <key>Needed</key>
    <string>4000</string>
    <key>Passed</key>
    <string>Yes</string>
</dict>
</array>
</plist>

我正在使用此代码写入文件:

NSMutableDictionary *array = [[NSMutableDictionary alloc]init]; 
[array setObject:field1.text forKey:@"Top"];
[array writeToFile:[self dataFilePath] atomically:YES];

设置键并放入值。但是有人可以帮我把它正确格式化,看起来像上面的 plist。

【问题讨论】:

    标签: ios objective-c xcode dictionary plist


    【解决方案1】:

    如果您右键单击 plist 文件,您应该可以在文本编辑器中打开它。如果这样做,您可以复制并粘贴您的格式吗?或者你的意思是你有太多的数据要手写,而你试图用脚本来写?

    【讨论】:

    • 是的,我可以打开它并对其进行编辑以按照我想要的方式进行设置,这不是问题,但是当我写入文件时,我一次只需要编辑一个字典项。 &lt;dict&gt; &lt;key&gt;Level&lt;/key&gt; &lt;string&gt;1&lt;/string&gt; &lt;key&gt;Top&lt;/key&gt; &lt;string&gt;5300&lt;/string&gt; &lt;key&gt;Needed&lt;/key&gt; &lt;string&gt;4000&lt;/string&gt; &lt;key&gt;Passed&lt;/key&gt; &lt;string&gt;Yes&lt;/string&gt; &lt;/dict&gt; 所以我需要设置一些东西,上面写着 objectAtIndex:1 - forKey"whatever"
    • 这是我给出的如何更新 plist 文件的示例。 stackoverflow.com/a/11131175/792139 您需要一些方法来区分不同的 dict 条目才能使用它。您可以尝试以某种方式标记它们吗?
    【解决方案2】:

    您的代码很混乱...您有一个名为array 的变量,但它被声明为字典。从您的属性列表示例中,您似乎想要一个位于外层的数组,因此您的代码应使用NSArrayNSMutableArray

    【讨论】:

    • 是的,这只是因为我正在处理其他代码。叫什么并不重要,我不知道它是数组还是字典是否重要。我只需要能够以与我在这里读取文件相同的格式写入文件 SkillArray = [[NSMutableArray alloc] initWithContentsOfFile:path]; NSLog(@"dict count: %d", [skillsArray count]); topScore = [[skillsArray objectAtIndex:level]objectForKey:@"Top"];
    【解决方案3】:

    这是一个示例代码:

      NSMutableArray *plistArray = [[ NSMutableArray alloc] initWithContentsOfFile:[self dataFilePath]];
      NSLog(@"plistArray before additon: %@", plistArray);
      for (NSMutableDictionary *dict in plistArray)
      {
        //if you want to search for a record only otherwise remove the if statement
        if ([[dict objectForKey:@"Top"] isEqualToString:@"0"])  //this just an example, modify this per your needed
          [dict setObject:field1.text forKey:@"Top"];  //select which dictionary record to set the Top key
      }
      NSLog(@"plistArray after additon : %@", plistArray);
      [plistArray writeToFile:[self dataFilePath] atomically:YES];
    

    【讨论】:

    • 感谢您的帮助,但我仍然没有得到任何地方 :( 我读了这样的文件 [[array objectAtIndex:0]objectForKey:@"Top"]; 我需要写回类似的内容,以便我可以更新密钥“顶部”字典中的不同项目。类似:[[dict objectAtIndex:1]setObject:field1.text forkey:@"Top"]; 但这不起作用。
    • 你的术语不是很清楚……这一行:[[array objectAtIndex:0]objectForKey:@"Top"];将为您从您发布的数据的第一条记录中提取与键“Top”对应的值,该记录是字符串“0”。在您发布的示例中,您有两条记录。每条记录都以 开头,以 结尾。如果要将 field1.text 设置为键名为“Top”的键/值对,有两种选择:
    • (如我的回答中所述)如果要为所有出现的键“Top”设置值,请不要在我的示例中使用 if 语句。因此,就像在您发布的数据中一样,结果会将 '0" 更改为 field1.text 并将 5300 更改为 field1.text 等。但是如果您只需要更改来申请特定记录,那么您需要使用 if在我的示例代码中声明以找到正确的记录,以便您只更改该特定记录。了解其工作原理的最简单方法是针对您发布的数据运行我的示例代码。
    • 这可能会有所帮助:我的示例代码中的 for 循环将逐步遍历您发布的数据中的每条记录(我的示例代码中的 dict 变量)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    相关资源
    最近更新 更多