2012-02-24 121 views
1

對不起,我看到類似的問題,但他們似乎沒有給我一些完整的答案。我試着把它整理好,這樣人們就不會恨我或我可憐的英語了。
我正在使用Xcode 4.2與故事板和ARC
我可以從我的plist文件中讀取。我的任務只是將更新後的值寫回到我的plist文件中。使用NSDictionary對象寫入plist文件

我的plist包含在主文件夾的「支持文件」子文件夾中(故事板就是這樣)。該文件是調用Global.plist並且GlobalValue2是文件類型字符串的一個元素。

所以讀取文件的部分看起來像這樣

NSString *plistfile = [[NSBundle mainBundle] pathForResource:@"Global" ofType:@"plist"]; 
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:plistfile]; 

FirstValueTextBox.text = [[dict valueForKey:@"GlobalValue1"] stringValue]; 

學習它的一些方便的YouTube視頻作品就好了。更新我的文本框的值。

真正的問題出現在我回寫我的plist文件時。當我嘗試以下方法

NSString *plistfile = [[NSBundle mainBundle] pathForResource:@"Global" ofType:@"plist"]; 
NSMutableDictionary *dict = [NSMutableDictionary 
dictionaryWithContentsOfFile:plistfile]; 

[dict setValue:@"ABC" forKey:@"GlobalValue2"]; 
SecondValueTextBox.text = [dict valueForKey:@"GlobalValue2"]; 
[dict writeToFile:plistfile atomically:YES]; 

結果我真的看到了一個更新的值上彈出第二個文本框,但plist文件保持不變。

以下是我的問題下來休息一下,我對這個問題的猜測

  1. 我嘗試使用NSDictionary中(不是的NSMutableDictionary)和呼叫的setValue(在運行時崩潰)
    我的猜測:NSDictionary的對象本身是隻讀的,所以當我說增加價值時它會使我崩潰。但是,在編碼時間裏爲什麼不讓我錯誤呢?如果對象是隻讀的

  2. 我使用NSMutableDictionary可以調用setValue。它不會使我崩潰,當我在「SecondValueTextBox.text = [dict valueForKey:@」GlobalValue2「];」「時調用更新的值;」它真的讓我更新了價值。但是plist文件裏面的內容沒有改變。這是我現在的結果。
    我的猜測是:經過一番搜索之後,我認爲「支持文件」也是隻讀的。純粹的猜測確實看到任何人直接談論它。

  3. 我確實嘗試了多一點,有些人談論了Xcode中的一個讀寫位置的「文檔文件夾」。我想人們也會談論編寫代碼來訪問該文件夾。有人可以在這裏給我看看代碼。

  4. 我最後一個問題,我可以將我的Xcode連接到該「文檔文件夾」或我在哪裏可以看到它(真正的文件夾結構不同於我認爲的Xcode內部)。這樣我就可以查看和編輯我的plist文件進行測試,我可以看到真正的結果,而無需使用

我將非常感激代碼和東西,如果人能告訴我,我的猜測是正確的還是錯誤的,回答我的3和4問題。

回答

4

爲了讓您的修改在您的plist中保留,您確實需要在啓動應用程序時將其從資源包複製到文件dirtectory,然後使用文件中的plist進行讀寫。

這裏是你如何能夠複製文件:如果這個問題似乎直截了當地有人對你

NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSError *error; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"Global.plist"]; 

if ([fileManager fileExistsAtPath:plistPath] == NO) { 
    NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"Global" ofType:@"plist"]; 
    [fileManager copyItemAtPath:resourcePath toPath:plistPath error:&error]; 
} 
+0

遺憾。 NSDocumentDirectory或文檔文件夾(或tmp文件夾)1.只存在於運行時? 2.只能找到我必須部署的設備。所以我不能在開發時添加plist?或者3.它是一個讀寫文件夾,但支持的文件夾不是那麼我在那裏複製?或者有其他原因背後呢? – 2012-02-24 17:18:17