以编程方式将新项添加到plist

时间:2015-06-16 13:58:27

标签: ios objective-c xcode plist

在我的last question我询问了有关从文件保存/加载的建议。 Plist建议非常棒,但当然我不得不遇到某种问题。我已经用plist填充了我的TableView> DetailView控制器。现在我必须以某种方式保存我的数据(来自parse.com)。这是我现在的plist,我手动填充它,为了简单起见(请不要杀我)我做了所有项目字符串:

<plist version="1.0">
<dict>
    <key>orderID</key>
    <array>
        <string>idKMVX956</string>
        <string>idEWUQ321</string>
    </array>
    <key>orderdate</key>
    <array>
        <string>28.06.2015</string>
        <string>26.06.2015</string>
    </array>
    <key>match</key>
    <array>
        <string>Team 3 vs Team 4</string>
        <string>Team 1 vs Team 2</string>
    </array>
    <key>date</key>
    <array>
        <string>20.06.2015</string>
        <string>20.06.2015</string>
    </array>
    <key>sector</key>
    <array>
        <string>2</string>
        <string>1</string>
    </array>
    <key>seat</key>
    <array>
        <string>R2S75</string>
        <string>R1S1</string>
    </array>
    <key>price</key>
    <array>
        <string>120</string>
        <string>60</string>
    </array>
</dict>
</plist>

现在我的问题是 - 如何向此plist添加新订单。为了测试我写了这个方法:

- (void)saveToPlist
{
    NSString *matchname = @"Team 5 vs Team 6";
    NSString *orderHistoryFile = [[NSBundle mainBundle] pathForResource:@"OrderHistory" ofType:@"plist"];
    orders = [[NSMutableDictionary alloc] initWithContentsOfFile:orderHistoryFile];
    match = [orders objectForKey:@"match"];
    NSLog(@"matches: %@", match);
    [match addObject:matchname];
    NSLog(@"addedTeam; %@", match);
    [match writeToFile:orderHistoryFile atomically:YES];
}

但是第二个NSLog显示确实将“Team 5 vs Team 6”添加到数组中 - plist文件中没有更改,也没有出现在tableview上。为什么呢?

@Update好吧,我看到我的错误与writetofile在哪里。但是现在执行此方法后 - 它只运行一次,我可以看到详细信息。然后我不能再加载数据,表格不会填充。为什么? 的 UPDATE2 所以我不能写在我的bundle目录中(ty的建议)。这使我试图将整个过程转移到文档。这是我写的一些代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *filePath = [[self fileDirectory] stringByAppendingString:@"OrderHistory.plist"];
    if (![[NSFileManager defaultManager]fileExistsAtPath:filePath]){
     [[NSFileManager defaultManager] copyItemAtPath:[[NSBundle mainBundle]pathForResource:@"OrderHistory" ofType:@"plist"] toPath:filePath error:nil]; 
     }
    orders = [[NSDictionary alloc] initWithContentsOfFile:filePath];
    orderId = [orders objectForKey:@"orderID"];
    NSLog(@"count orders: %d", [orderId count]);
}
- (NSString *)fileDirectory{
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

}

现在我的NSLog计数项目输出0.所有内容都适用于bundle目录,所以我怀疑文件甚至没有在文档中创建。我的错误在哪里?

2 个答案:

答案 0 :(得分:1)

您无法写入应用程序包,因此您需要将文件保存到Documents文件夹或等效文件夹(例如Caches文件夹)。

答案 1 :(得分:0)

你的错误在于:[[self fileDirectory] stringByAppendingString:@"OrderHistory.plist"];

它应该是-stringByAppendingPathComponent,当你像字符串一样追加它时,你会错过与directoryPath相关的/