2009-04-14 10 views
49

que estaba creando una estructura de datos de forma manual utilizando la siguiente:Cómo leer la estructura de datos del archivo de .Plist en NSArray

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 lee de un archivo. Así que creé la leagues.plist archivo que tiene la siguiente estructura:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
    <array> 
     <dict> 
      <key>category</key> 
      <string>English</string> 
      <key>leagues</key> 
      <array> 
       <dict> 
        <key>name</key> 
        <string>Barclays Premier League</string> 
        <key>shortname</key> 
        <string>Premier League</string> 
        <key>id</key> 
        <string>101</string> 
       </dict> 
       <dict> 
        <key>name</key> 
        <string>Coca-Cola Championship</string> 
        <key>shortname</key> 
        <string>Championship</string> 
        <key>id</key> 
        <string>102</string> 
       </dict> 
      </array> 
     </dict> 
     <dict> 
      <key>category</key> 
      <string>Scottish</string> 
      <key>leagues</key> 
      <array> 
       <dict> 
        <key>name</key> 
        <string>Scottish Premier League</string> 
        <key>shortname</key> 
        <string>SPL</string> 
        <key>id</key> 
        <string>201</string> 
       </dict> 
      </array> 
     </dict> 
     <dict> 
      <key>category</key> 
      <string>Tournaments</string> 
      <key>leagues</key> 
      <array> 
       <dict> 
        <key>name</key> 
        <string>Champions League</string> 
        <key>shortname</key> 
        <string>UCL</string> 
        <key>id</key> 
        <string>501</string> 
       </dict> 
      </array> 
     </dict> 
    </array> 
</plist> 

¿Cómo se lee este archivo en el que he intentado varios métodos, pero nada ha funcionado.. Ni siquiera sé si estoy buscando el archivo en el lugar correcto. Para tener una referencia que estoy tratando 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); 

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

Gracias amablemente

Respuesta

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

Esa respuesta es correcta - ¿está seguro de que el archivo se encuentra 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 objetivo que estás creando, un error fácil de hacer, especialmente si tienes varios objetivos.

+0

Sólo aprendiendo aquí :). No sé si está en el paquete principal. Gracias, lo comprobaré a continuación. – Xetius

+1

Es: '[NSDictionary dictionaryWithContentsOfFile: plistPath];' – shebelaw

+0

Gracias @shebelaw, ajusté el código. Pensé que era una matriz ... –

2

Kendall es correcto.

En mi experiencia, necesita agregar su archivo a la carpeta "Recursos" en xcode.

+0

¿Qué tal una carpeta dentro de la carpeta de Recursos? ¿Se puede agregar también allí? – Patricia

+0

@Patricia está bien, solo asegúrate de que sea relativo al grupo. – Kjuly

2

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 que esto funcione correctamente que tenía que hacer 3 cosas:

  1. poner el archivo en la carpeta de recursos

  2. nombre del archivo correctamente (era leagues.plist en lugar de league.plist)

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

la tercera parte crea un NSArray asignado que no libera cuando se sale del alcance de esta función ... Por supuesto, esto tenía que ser lanzado en la función dealloc.

+0

para la liberación automática ... simplemente puede "retener" cuando corresponda. – dwery

0

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 objetivo diferente (había agregado un nuevo objetivo un momento antes). Por lo tanto, la solución fue .plist> Obtener información> Objetivos, y asegúrese de que se agrega al objetivo 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!

4

Utilice 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 Utilizar este:

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

tuve este problema, pero no estaba trabajando porque yo estaba dando los resultados de la 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]; 
0

Si el archivo no se agrega en la carpeta de recursos y solo se coloca en el directorio de documentos. Usted puede hacer esto

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

Este código está trabajando

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