2012-02-08 103 views
0

使用此代碼我試圖從Templates.plist文件中獲取數據,但我在數組中獲得了空值。從plist獲取數據到NSMutableArray並將NSMutableArray寫入到相同的plist iPhone

//from plist 
NSString *path = [[NSBundle mainBundle] pathForResource:@"Templates" ofType:@"plist"]; 
NSMutableArray *arry=[[NSMutableArray alloc]initWithContentsOfFile:path]; 

NSLog(@"arrayArray:::: %@", arry); 

這是我的plist文件:

Plist file

此外,我想知道我怎麼可以添加多個字符串這個plist文件,並從該plist中刪除的字符串。

回答

3

首先,您無法寫入任何內容mainBundle。爲了給您寫信給plist,您需要將其複製到文檔目錄中。這是這樣做的:

- (void)createEditableCopyOfIfNeeded 
{ 
    // First, test for existence. 
    BOOL success; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writablePath = [documentsDirectory stringByAppendingPathComponent:@"Template.plist"]; 
    success = [fileManager fileExistsAtPath:writablePath]; 

    if (success) 
     return; 

    // The writable file does not exist, so copy from the bundle to the appropriate location. 
    NSString *defaultPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Template.plist"]; 
    success = [fileManager copyItemAtPath:defaultPath toPath:writablePath error:&error]; 
    if (!success) 
     NSAssert1(0, @"Failed to create writable file with message '%@'.", [error localizedDescription]); 
} 

所以調用此函數將檢查文件是否存在於文檔目錄中。如果它沒有將文件複製到文檔目錄。如果文件存在,它只是返回。接下來,您只需訪問該文件即可讀取和寫入該文件。要訪問您只需要文檔目錄的路徑並將您的文件名添加爲路徑組件。

NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *filePath = [docDir stringByAppendingPathComponent:@"Template.plist"]; 

從plist中獲取數據:

NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:filePath]; 

將文件寫入迴文件目錄。

[array writeToFile:filePath atomically: YES]; 
+0

沒有成功仍然獲得數組的空值,我已經添加了你的方法 - (void)createEditableCopyOfIfNeeded,然後從視圖DidLoad調用它作爲[self createEditableCopyOfIfNeeded],調用此函數後,我已經使用你的代碼讀取plist文件但得到空值 – 2012-02-09 09:35:49

+0

我曾遇到過這個問題。你可能需要做的是重置模擬器。這段代碼所做的是,如果有一個名爲Template.plist的文件,它將不會覆蓋它。所以如果文件已經存在,那麼這個代碼將不會爲你工作,直到你刪除它。通過運行模擬器並點擊iOS模擬器菜單並按下重置內容和設置,即可完成此操作。這將擦拭模擬器清潔。其他選項是使用NSLog(@「%@」,filePath);然後按照路徑直到找到文件並將其刪除。 – Jaybit 2012-02-09 15:59:03

2
-(NSMutableArray *)start1 

{ 

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

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



if ([[NSFileManager defaultManager] fileExistsAtPath:plistPath]){ 

    plistArr = [NSMutableArray arrayWithContentsOfFile: plistPath]; 

} 
else { 
    plistArr = [[NSMutableArray alloc] init]; 

} 
return plistArr; 
} 


- (void)createNewRecordWithName:(NSMutableDictionary *)dict 

{ 

plistArr=[self start1]; 
[plistArr addObject: dict]; 
//[dict release]; 
[self writeProductsToFile:plistArr]; 

} 

    - (void)writeProductsToFile:(NSMutableArray *)array1 { 

    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

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

[array1 writeToFile:plistPath atomically:YES]; 

    } 
+0

感謝名單KAREEM MAHAMMED,可以請你告訴我的鏈接本教程,這樣我就又知道怎麼回事這個代碼 – 2012-02-08 12:43:21

+0

使用start方法你得到的所有值。同樣通過創建方法,你將添加新的場景到YOur plist文件 – 2012-02-08 12:56:18

+0

在這裏你必須使用NSString而不是NSMutableDictinory – 2012-02-08 12:57:38

0

要獲取的plist到一個可變數組,使用此類方法:

NSMutableArray *array = [NSMutableArray arrayWithContentsOfFile:path]; 

然後,從陣列中添加/刪除字符串。要將陣列保存爲plist,請使用:

[array writeToFile:path atomically:YES];