2013-11-20 75 views
1

在一種方法中,我需要從plist文件中讀取NSArrayNSDictionary來自plist文件的NSArray或NSDictionary

這是我的問題:當我不知道它是否是數組或字典時,如何從plist文件創建NSArrayNSDictionary

我知道我可以做:

NSArray *myArray = [NSArray arrayWithContentsOfFile:filePath]; 

NSDictionary *myDico = [NSDictionary dictionaryWithContentsOfFile:filePath]; 

但我不知道,如果文件路徑包含NSArrayNSDictionary。我想這樣的事:

id myObject = [... ...WithContentOfFile:filePath]; 

有人可以幫助我,給我最好的方式來做到這一點?

回答

6

下面是如何

NSData *data = [NSData dataWithContentsOfFile:filePath]; 
id obj = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable format:NULL error:nil]; 

if([obj isKindOfClass:[NSDictionary class]]) { 
    //cast obj to NSDictionary 
} 
else if([obj isKindOfClass:[NSArray class]]) { 
    //cast obj to NSArray 
} 
+1

它也是完美的工作!謝謝 ! – Jonathan

1

您可以使用isKindOfClass方法來檢測哪個類。 你將不得不使用加載的.plist文件:

NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
plistPath = [rootPath stringByAppendingPathComponent:@"Data.plist"]; 
if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) { 
    plistPath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"]; 
} 

NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; 
id objectFromPlist = [NSPropertyListSerialization 
    propertyListWithData:plistXML 
    options:0 
    format:&format 
    errorDescription:&errorDesc]; 

而且,您可以點擊這裏:

if([objectFromPlist isKindOfClass:[NSArray class]]) 
{ 
    NSArray* plistArray = (NSArray*) classFromPlist; 
} 
+0

謝謝你的答案,但我怎麼能得到classFromPlist對象? – Jonathan

+0

使用其他提示更新了我的答案。 –

+0

謝謝!它完美的工作! 但是該頁面[鏈接](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nspropertylistserialization_Class/Reference/Reference.html#//apple_ref/occ/clm/NSPropertyListSerialization/ propertyListWithData:options:format:error)表示它很快就會被棄用。 – Jonathan