2011-06-02 27 views
6

tengo un plist con una matriz que contiene 2 cadenas ver la imagen:arrayWithContentsOfFile no puede leer el archivo plist

http://imageshack.us/photo/my-images/263/myplist.png/

y en mi viewDidLoad añado esto:

NSString *file = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"]; 

NSArray *array = [NSArray arrayWithContentsOfFile:file]; 

NSLog(@"array = %@", array); 

Pero i siempre tiene null ¿por qué? Gracias por la ayuda.

ACTUALIZACIÓN: la solución es que necesita editar manualmente el archivo plist (Xcode4 utilizar Dictionnary por defecto)

<?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> 
    <array> 
     <string>HO</string> 
     <string>HI</string> 
    </array> 
</array> 
</plist> 
+0

publique el código completo .. – Aravindhan

+0

@funnyCoder ¿Comprobó que existe la ruta? ¿Quizás incluir un archivo '[[NSFileManager defaultManager] fileExistsAtPath: file]' ahí? –

+0

@Aravindhanarvi Este es mi código completo :). – funnyCoder

Respuesta

13

Muy probablemente, su plist es un diccionario que contiene una matriz (Xcode 4 no lo hace permitir crear plists con una matriz como el objeto raíz). Intentar algo como esto:

NSString *file = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"]; 
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:file]; 
NSArray *array = [dict objectForKey:@"Array"]; 
NSLog(@"%@", array); 
+0

Gracias, pero siempre tengo nulo !!! – funnyCoder

+0

Lo siento, gracias, está bien :). ¿Pero puedes explicar por qué esto? – funnyCoder

+0

@omz dude que permite crear realmente permite crear una matriz como root – NIKHIL

0

plist should start with Root Key

en que la aplicación necesita cambiar el nombre de la clave raíz que no puede ser de tipo de datos

+0

Lo cambié pero no tuve éxito, parece que Xcode 4 no permite plist de matriz ?! – funnyCoder

+0

Ohhh Sí, es así – NIKHIL

+0

¿Así que tienes que lidiar con eso? ¿Me puede dar una URL sobre el soporte de Xcode4 Array Plist? Gracias. – funnyCoder

0

He sido estudiado este tema y descubrir algunas diferencias en archivo plist.

Por ejemplo, tengo el archivo plist original en código de ejemplo que se lee con el método
NSArray *array = [[NSArray alloc] initWithContentsOfFile:path];

el archivo original XML es:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" 
"http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 

<plist version="1.0"> 

<array> 
<dict> 
    <key>nameKey</key> 
    <string>Number One</string> 
    <key>imageKey</key> 
    <string>small_one.png</string> 
</dict> 
<dict> 
    <key>nameKey</key> 
    <string>Number Two</string> 
    <key>imageKey</key> 
    <string>small_two.png</string> 
</dict> 

</array>   
</plist> 

Cuando probé para crear esta misma archivo arriba en Xcode Interface, usando Add new File Property List, y después de editar el puting de la misma manera que se muestra en la interfaz para el archivo anterior, el método [[NSArray alloc] initWithContentsOfFile:path]; falla, y encontré el problema en la estructura del archivo xml plist. El archivo creado utilizando XCode interfaz, el resultado en el archivo plist xml:

<plist version="1.0"> 
<dict> 
<key>item 0</key> 
<dict> 
    <key>imageKey</key> 
    <string>image1.jpg</string> 
</dict> 
<key>item 1</key> 
<dict> 
    <key>imageKey</key> 
    <string>image2.jpg</string> 
</dict> 
</dict> 
</plist> 

i fijo cambio directo en el archivo XML como mismo el primer ejemplo, y el método funciona bien.

El punto está en la interfaz XCode para el archivo plist, no puede ver estas diferencias. Ambos se ven iguales. Tal vez es mi Xcode 4.1

0

La respuesta correcta es que el elemento raíz ya es una matriz (en XCode4 .. no estoy seguro de los demás). Entonces, si coloca otra matriz como neil d mostrada en su captura de pantalla, terminará con una matriz que contiene una matriz con los dos valores de cadena.

0

plist de este tipo:

enter image description here

OR (básicamente ambos son mismo)

enter image description here

se puede leer como esto:

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

Dónde appFeatures es el nombre de plist. (iOS 6.1)

Cuestiones relacionadas