Cómo leer la estructura de datos del archivo .plist en NSArray

Estaba creando una estructura de datos manualmente usando lo siguiente:

NSDictionary* league1 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Barclays Premier League", @"name", @"Premier League", @"shortname", @"101", @"id", nil]; NSDictionary* league2 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Coca-Cola Championship", @"name", @"Championship", @"shortname", @"102", @"id", nil]; NSDictionary* league3 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Scottish Premier League", @"name", @"SPL", @"shortname", @"201", @"id", nil]; NSDictionary* league4 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Champions League", @"name", @"UCL", @"shortname", @"501", @"id", nil]; contentArray = [[NSArray alloc] initWithObjects: [[NSDictionary alloc] initWithObjectsAndKeys: @"English", @"category", [[NSArray alloc] initWithObjects: league1, league2, nil], @"leagues", nil], [[NSDictionary alloc] initWithObjectsAndKeys: @"Scottish", @"category", [[NSArray alloc] initWithObjects: league3, nil], @"leagues", nil], [[NSDictionary alloc] initWithObjectsAndKeys: @"Tournaments", @"category", [[NSArray alloc] initWithObjects: league4, nil], @"leagues", nil], nil]; [league1 release]; [league2 release]; [league3 release]; [league4 release]; 

Sin embargo, pensé que esto sería mejor si se leyera desde un archivo. Así que creé el archivo leagues.plist que tiene la siguiente estructura:

      category English leagues   name Barclays Premier League shortname Premier League id 101   name Coca-Cola Championship shortname Championship id 102     category Scottish leagues   name Scottish Premier League shortname SPL id 201     category Tournaments leagues   name Champions League shortname UCL id 501      

¿Cómo leo este archivo? He intentado varios métodos pero nada ha funcionado. Ni siquiera sé si estoy buscando el archivo en el lugar correcto. Como referencia, estoy probando los siguientes métodos:

 NSString* errorDesc = nil; NSPropertyListFormat format; NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"]; NSData* plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; contentArray = (NSArray*)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc]; if (!contentArray) { NSLog(errorDesc); [errorDesc release]; } 

o

 NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"]; contentArray = [NSArray arrayWithContentsOfFile:plistPath]; 

o

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsPath = [paths objectAtIndex:0]; NSString *fooPath = [documentsPath stringByAppendingPathComponent:@"leagues.plist"]; NSLog(fooPath); contentArray = [NSArray arrayWithContentsOfFile:fooPath]; NSLog(@"%@",contentArray); 

Esto finalmente me está volviendo completamente loco. ¡Ayuda por favor!

Gracias por su amabilidad

 NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"]; contentDict = [NSDictionary dictionaryWithContentsOfFile:plistPath]; 

Esa respuesta es correcta: ¿estás seguro de que tu archivo está en la aplicación? ¿Lo agregó a su proyecto y verifica si se copia en el paquete de su aplicación? De lo contrario, podría ser que el archivo no se haya agregado al objective que estás creando, un error fácil de hacer, especialmente si tienes varios objectives.

Use este código si el plist está en la carpeta de recursos del proyecto.

  NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"]; contentArray = [NSArray arrayWithContentsOfFile:sourcePath]; 

Si el plist está dentro del directorio de documentos de la aplicación, use esto:

  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; NSString *plistName = @"league"; NSString *finalPath = [basePath stringByAppendingPathComponent: [NSString stringWithFormat: @"%@.plist", plistName]]; contentArray = [NSArray arrayWithContentsOfFile:finalPath]; 

Tuve este problema, pero no funcionaba porque estaba colocando los resultados de pList en una matriz donde debería haber sido un diccionario, es decir,

 NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"VehicleDetailItems" ofType:@"plist"]; NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:plistPath]; 

Kendall está en lo cierto.

En mi experiencia, necesitas agregar tu archivo a la carpeta “Recursos” en xcode.

Para completar, Kendall y Bentford son completamente correctos. Sin embargo, en mi ejemplo, contentArray era una propiedad y al final del método salía del ámbito porque arrayWithContentsOfFile crea un objeto de liberación automática.

Para hacer que esto funcione correctamente, tuve que hacer 3 cosas:

  1. poner el archivo en la carpeta de recursos

  2. nombre el archivo correctamente (era ligas.plist en lugar de liga.plist)

  3. lea el archivo usando [[NSArray alloc] initWithContentsOfFile: plistPath)];

la tercera parte crea un NSArray asignado que no se libera cuando sale del scope de esta función … por supuesto, esto debe ser liberado en la función dealloc.

Solo para agregar. Tuve el mismo problema y la solución sugerida me ayudó a resolver el problema, sin embargo, no estoy seguro de si realmente utilicé la solución exacta. En mi caso, el problema era que el archivo .plist se había agregado a un objective diferente (había agregado un nuevo objective un momento antes). Por lo tanto, la solución fue .plist> Obtener información> Objetivos, y asegúrese de que se agrega al objective correcto para que se copie al dispositivo cuando se instala. Maldición, si me hubiera dado cuenta de eso, habría ahorrado mucho tiempo. Espero que esto también sea útil. ¡Saludos!

Si el archivo no se agrega en la carpeta de recursos y solo se coloca en el directorio de documentos. Puedes hacerlo

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *path = [documentsDirectory stringByAppendingPathComponent:@"file.plist"]; NSMutableArray *arrContentsplist = [[NSMutableArray alloc] initWithContentsOfFile:path]; 

Este código está funcionando

 NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"plist-name" ofType:@"plist"]; NSDictionary *Dictionary= [[NSDictionary alloc]initWithContentsOfFile:plistPath]; NSLog(@" current version CFBundleVersion = %@",[Dictionary valueForKey:@"CFBundleVersion"]);