2011-08-05 48 views
11

我使用了一段代碼我已經成功之前用於一個plist中加載到一個數組:訪問的plist在app束返回null

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"species_names" ofType:@"plist"]; 
NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath]; 

的initWithContentsOf文件失敗(數組爲空,暗示它無法在應用程序包中找到plist)。

在iPhone模擬器下,我檢查了第一行創建的路徑指向應用文件(它確實),並使用Finder上下文菜單「Show package contants」向我自己證明「species_name.plist 「實際上是捆綁在一起的 - 其長度表明它包含的東西,所以它應該工作(並在我寫的其他iOS應用程序中)。建議最受歡迎...

[env Xcode 4.2 beta,iOS 4.3.2]。

回答

27

您應該使用initWithContentsOfFile:方法的NSDictionary實例,而不是NSArray。 下面是示例:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"species_names" ofType:@"plist"]; 
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath]; 
NSArray *array = [NSArray arrayWithArray:[dict objectForKey:@"Root"]]; 

或者這樣:

NSString *errorDesc = nil; 
NSPropertyListFormat format; 
NSString *path = [[NSBundle mainBundle] pathForResource:@"startups" ofType:@"plist"]; 
NSData  *plistXML = [[NSFileManager defaultManager] contentsAtPath:path]; 
NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization      
              propertyListFromData:plistXML 
mutabilityOption:NSPropertyListMutableContainersAndLeaves 
              format:&format 
              errorDescription:&errorDesc]; 
NSArray *array = [NSArray arrayWithArray:[temp objectForKey:@"Root"]]; 


編輯

您可以使用NSArrayinitWithContentsOfFile:方法用的NSArraywriteToFile:atomically:方法創建的文件。與writeToFile:atomically:創建plist中有這樣stucture:

<plist version="1.0"> 
<array> 
    ...Content... 
</array> 
</plist> 

而且plist中XCode中創造了這個stucture:

<plist version="1.0"> 
<dict> 
    ...Content... 
</dict> 
</plist> 

這就是爲什麼的NSArray dosnt工作initWithContentsOfFile:方法。

+0

這讓我的軌道上;謝謝。 – RonC

2

這種類型的plist

enter image description here

OR(基本上都是相同的)

enter image description here

可以這樣寫:

NSString *file = [[NSBundle mainBundle] pathForResource:@"appFeatures" ofType:@"plist"]; 
NSArray *_arrFeats = [NSArray arrayWithContentsOfFile:file]; 
NSLog(@"%d", _arrFeats.count); 

appFeaturesplist的名稱。 (的iOS 6.1)

0

試試這個簡單的梅託德:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self plistData]; 
} 


- (void)plistData 
{ 
    NSString *file = [[NSBundle mainBundle] pathForResource:@"appFeatures" ofType:@"plist"]; 
    NSArray *messages = [NSArray arrayWithContentsOfFile:file]; 
    NSLog(@"%d", messages.count); 

    for (int i=0; i<messages.count; i++) 
    { 
     NSString *data = [messages objectAtIndex:i]; 
     NSLog(@"\n Data = %@",data); 
    } 
} 
相關問題