acceso a plist en package de aplicaciones devuelve null

Estoy usando una pieza de código que he usado antes para cargar un plist en una matriz:

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

El file initWithContentsOf está fallando (la matriz es nula, lo que sugiere que no puede encontrar el plist en el package de aplicaciones).

Debajo del simulador de iPhone comprobé que la ruta creada por la primera línea apunta al file de la aplicación (lo hace) y usé el menu contextual del Finder "Mostrar contantes del package" para demostrar que "species_name.plist" está realmente en el package, con una longitud que sugiere que contiene cosas, por lo que debería funcionar (y tiene en otras aplicaciones de iOS que he escrito). Sugerencias más bienvenidas …

[env Xcode 4.2 beta, iOS 4.3.2].

Debería usar initWithContentsOfFile: método de instancia NSDictionary , no NSArray . Aquí hay una muestra:

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

O esto:

 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"]]; 

EDITAR

Puede usar initWithContentsOfFile: método de NSArray con el file creado con writeToFile:atomically: método de NSArray . Plist creado con writeToFile:atomically: tiene esta estructura:

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

Y Plist creado en XCode tiene esta estructura:

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

Es por eso que initWithContentsOfFile: método de NSArray dosnt funciona.

plist de este tipo:

introduzca la descripción de la imagen aquí

O (básicamente, ambos son iguales)

introduzca la descripción de la imagen aquí

Se puede leer así:

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

Donde appFeatures es el nombre del plist . (iOS 6.1)

Prueba este sencillo método:

 - (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); } }