responsedata how example consuming ios objective-c swift

how - rest swift ios



Cómo leer Array desde Plist iOS (6)

Estoy tratando de leer Plist que contiene array

<?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"> <dict> <key>key1</key> <string>value1</string> <key>key2</key> <string>value2</string> <key>keyarray1</key> <array> <string>keyitem1</string> <string>keyitem2</string> </array> </dict> </plist>

cuando intento leer valueForKey: @ "keyarray1", obtengo un valor nulo. Traté de leer como una cadena y tuerca matriz no sirve.

Mi código

NSDictionary * values=[[NSDictionary alloc] initWithContentsOfFile:@"values.plist"]; NSArray *arrayValues=[[NSArray alloc] initWithArray:[values valueForKey:@"keyarray1"]];


¿Dónde se almacena el plist? ¿Está en el paquete de la aplicación? Si es así, probablemente desee utilizar [[NSBundle mainBundle] pathForResource:@"values" ofType:@"plist"] para obtener la ruta, en lugar de hardcoding @"values.plist" .

Una vez que tenga la ruta hacia abajo correctamente, puede obtener la matriz del diccionario sin ningún problema, con algo como [values objectForKey:@"keyarray"] .

Nota final: hay una diferencia entre objectForKey: y valueForKey: Actualmente estás usando valueForkey: que es parte de NSKeyValueCoding , un protocolo que cumple con NSDictionary. Debe usar objectForKey: (o objectForKey: sintácticos de azúcar, es decir, dictionary[@"key"] ), ya que son las formas adecuadas de acceder a un valor desde un diccionario.


¿Puedes intentar seguir el código?

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"values" ofType:@"plist"]; NSDictionary * values=[[NSDictionary alloc] initWithContentsOfFile:plistPath]; NSArray *arrayValues=[[NSArray alloc] initWithArray:[values valueForKey:@"keyarray1"]]; NSLog(@"arrayValues = %@",arrayValues);

Obtuve la siguiente salida en el registro: -

arrayValues = ( keyitem1, keyitem2 )


En primer lugar, verifica tu apariencia como:

Ahora escribe las siguientes líneas donde estás accediendo a tu lista

C objetivo:

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Values" ofType:@"plist"]]; NSArray *array = [dictionary objectForKey:@"keyarray1"]; NSLog(@"dictionary = %@ /narray = %@", dictionary, array);

Aquí está la captura de pantalla completa (con salida de registro) de mi ventana de trabajo:

Rápido:

let dictionary = NSDictionary(contentsOfFile: Bundle.main.pathForResource("Values", ofType: "plist")!); let array = dictionary?["arrayKey"] as! NSArray print("dictionary=", dictionary, "/narray =", array)


Prueba esto

NSString *path = [[NSBundle mainBundle] bundlePath]; NSString *finalPath = [path stringByAppendingPathComponent:@"values.plist"]; NSMutableDictionary *dict =[NSMutableDictionary dictionaryWithContentsOfFile:finalPath]; NSArray *arr =[dict valueForKey:@"keyarray1"]; NSLog(@"%@",arr);


Sé que esta pregunta es demasiado antigua y me gustaría agregar más información para aquellas personas que se encuentren con esto recientemente.

En mi caso, creé un plist como Array (el valor predeterminado de plist es Dictionary con clave "Root").

entonces el xml se ve así:

En mi controlador de vista, inicializo directamente el Array en lugar de inicializar el Diccionario y luego obtengo el objeto para la clave "Root":

Nota: solo quise agregar esta información ya que solo veo inicializar el Diccionario y luego obtener el objeto para las claves. Espero que les ayude chicos.


Swift 4

Como en Swift 4, puedes usar codable y PropertyListDecoder

func setData() { // location of plist file if let settingsURL = Bundle.main.path(forResource: "JsonPlist", ofType: "plist") { do { var settings: MySettings? let data = try Data(contentsOf: URL(fileURLWithPath: settingsURL)) let decoder = PropertyListDecoder() settings = try decoder.decode(MySettings.self, from: data) print("array is /(settings?.keyarray1 ?? [""])")//prints ["keyitem1", "keyitem2"] } catch { print(error) } } } } struct MySettings: Codable { var keyarray1: [String]? init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) keyarray1 = try values.decodeIfPresent([String].self, forKey: .keyarray1) } }

Para más información, vea esto Cómo leer de una lista con la aplicación Swift 3 para iOS