2011-08-05 20 views
11

estoy usando un trozo de código que he usado antes con éxito para cargar un plist en una matriz:acceso a plist en el paquete de aplicación devuelve null

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

El archivo initWithContentsOf está fallando (matriz es nulo , sugiriendo que no puede encontrar el plist en el paquete de la aplicación).

En el simulador de iPhone compruebo que la ruta creada por la primera línea apunta al archivo de la aplicación (lo hace), y utilicé el menú contextual de Finder "Mostrar contenido del paquete" para probarme que "species_name.plist "está realmente en el paquete - con una longitud que sugiere que contiene cosas, por lo que debería funcionar (y lo tiene en otras aplicaciones iOS que he escrito). Sugerencias más bienvenidas ...

[env Xcode 4.2 beta, iOS 4.3.2].

Respuesta

27

Debe utilizar el método initWithContentsOfFile: de la instancia NSDictionary, no NSArray. Aquí está la 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 utilizar initWithContentsOfFile: método de NSArray con archivo creado con writeToFile:atomically: método de NSArray. Plist creada con writeToFile:atomically: tiene esta stucture:

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

Y Plist creado en XCode tiene este stucture:

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

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

+0

Eso me puso en la pista; Gracias. – RonC

2

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"]; 
NSArray *_arrFeats = [NSArray arrayWithContentsOfFile:file]; 
NSLog(@"%d", _arrFeats.count); 

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

0

Prueba esta sencilla metod:

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