web-dev-qa-db-fra.com

NSString: nouvelle ligne d'échappement dans le plist

J'écris une liste de propriétés pour faire partie du groupe de ressources de mon application. Un objet NSString dans le plist doit comporter des sauts de ligne. J'ai essayé \n, mais ça ne marche pas. Que dois-je faire pour avoir des nouvelles lignes dans ma chaîne dans le plist?

Merci.

48
Jonathan Sterling

Si vous modifiez le plist dans l'éditeur de plist inbuild de Xcode, vous pouvez appuyer sur option-return pour entrer un saut de ligne dans une valeur de chaîne.

106
Dave Addey

J'ai trouvé une solution plus simple:

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

Il semble que le lecteur de chaîne échappe à tous les caractères qui doivent être échappés, de sorte que le texte du plist soit rendu intégralement. Ce code supprime efficacement l'évasion supplémentaire.

35
Mihai Damian

Modifiez votre plist en utilisant un éditeur de texte au lieu de l'éditeur de plist de Xcode. Ensuite, vous mettez simplement des sauts de ligne dans vos chaînes directement:

<string>foo
bar</string>
20
Jon Reid

un peu tard, mais j'ai découvert le même problème et j'ai également découvert une solution ou une solution de contournement. donc pour ceux qui trébuchent, cela va obtenir une réponse :)

le problème est donc que lorsque vous lisez une chaîne dans un fichier,\n sera composé de 2 caractères contrairement à xcode, le compilateur reconnaîtra\n comme tel.

donc j'ai étendu la classe NSString comme ceci:

"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

Comment l'utiliser:

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

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

son rapide et sale, sachez que \\ n dans votre fichier ne sera pas reconnu comme\n donc si vous avez besoin d'écrire\n sur du texte vous devez modifier la méthode :)

4
justAfix

Voici comment je charge mon plist dans 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
}

Donc, je récupère d'abord la valeur de plist stockée dans la variable xxRaw, puis je cherche __ "double undescore" et je la remplace par "\ r", c'est-à-dire un retour chariot pour une nouvelle ligne, qui est placée dans la variable finale.

0
sakumatto