2010-01-10 14 views
44

Estoy escribiendo una lista de propiedades para estar en el paquete de recursos de mi aplicación. Un objeto NSString en el plist necesita tener saltos de línea. Intenté \n, pero eso no funciona. ¿Qué debo hacer para tener nuevas líneas en mi cadena en el plist?NSString: newline escape in plist

Gracias.

Respuesta

97

Si está editando el plist editor plist inbuild de Xcode, puede pulsar la opción de que se vuelva a introducir un salto de línea dentro de un valor de cadena.

+0

agregar saltos de línea manualmente puede funcionar si los archivos son estáticos y pocos. Pero realmente no es una solución "verdadera" (basada en código). Las únicas soluciones basadas en código son las de Mihai Damian y justAfix. – Anshu

+0

+1 que funcionó! ¡Gracias! – Jean

+0

Esto parece funcionar bien para mí en iOS 7 con un UILabel, sin embargo, parece que no funciona con iOS 6.Estoy usando 'option + return' en el plist, pero mi UILabel en iOS 6 no tiene el salto de línea. ¿Alguien más está viendo este comportamiento? – njkremer

19

Edite su plist usando un editor de texto en lugar del editor plist de Xcode. Entonces sólo tiene que poner saltos de línea en sus cadenas directamente:

<string>foo 
bar</string> 
+0

Gracias por la sugerencia! –

+0

A veces las soluciones más simples son las mejores – MandisaW

4

un poco tarde, pero descubrí el mismo problema y también descubrí una solución o una solución. entonces cualquiera que tropiece con esto obtendrá una respuesta :)

así que el problema es que cuando lee una cadena de un archivo, \ n será de 2 caracteres a diferencia de xcode que el compilador reconocerá \ n como uno.

así que extendieron la clase NSString así:

"NSString + newLineToString.h":

@interface NSString(newLineToString)  
-(NSString*)newLineToString; 
@end 

"NSString + newLineToString.m":

#import "NSString+newLineToString.h" 

@implementation NSString(newLineToString) 

-(NSString*)newLineToString 
{ 
    NSString *string = @""; 
    NSArray *chunks = [self componentsSeparatedByString: @"\\n"]; 

    for(id str in chunks){ 
     if([string isEqualToString:@""]){ 
      string = [NSString stringWithFormat:@"%@",str]; 
     }else{ 
      string = [NSString stringWithFormat:@"%@\n%@",string,str]; 
     } 

    } 
    return string; 
} 
@end 

Como utilizar it:

rootDict = [[NSDictionary alloc]initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"yourFile" ofType:@"plist"]]; 

NSString *string = [[rootDict objectForKey:@"myString"] newLineToString]; 

es rápido y sucio, tenga en cuenta que \\ n en su archivo no se reconocerá como \ n por lo que si necesita escribir \ n en el texto debe modificar el método :)

+0

Esto funciona; Me pregunto si no hay una solución más fácil, sin embargo. –

+0

excelente solución. Y observación interesante. Me ahorró días de esfuerzo. Es esencialmente lo mismo que la solución de Mihai Damian, pero esta realmente explica la razón detrás de esto. – Anshu

34

Encontré una solución más simple:

NSString *newString = [oldString stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"]; 

parece que el lector cadena escapa todos los caracteres que deben ser escapados de tal manera que el texto de la plist se hace palabra por palabra. Este código efectivamente elimina el escape extra.

0

Esto es como lo hago cargar mi plist en Swift 2.0:

plist:

<?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>STRING_TEXT</key> 
    <string>This string contains an emoji and a double underscore!__The double undescore is converted when the plist item is read.</string> 
</dict> 
</plist> 

Swift 2.0:

import Foundation 

var stringTextRaw = plistValueForString(keyname:"STRING_TEXT") 
var stringText = stringTextRaw.stringByReplacingOccurrencesOfString("__", withString: "\r") 



func plistValueForString(keyname keyname:String) -> String { 

    let filePath = NSBundle.mainBundle().pathForResource("StringsToUse", ofType:"plist") 
    let plist = NSDictionary(contentsOfFile:filePath!) 

    let value:String = plist?.objectForKey(keyname) as! String 
    return value 
} 

Así que primero obtener el valor plist almacenado en el xxRaw variable y luego busque __ "double undescore" y reemplace eso con "\ r", es decir, retorno de carro para una nueva línea y esto se coloca en la variable final.