2010-01-10 9 views
44

J'écris une liste de propriétés pour être dans le regroupement de ressources de mon application. Un objet NSString dans le plist doit avoir des sauts de ligne. J'ai essayé \n, mais cela ne fonctionne pas. Que dois-je faire pour avoir de nouvelles lignes dans ma ficelle dans le plist?NSString: nouvelle ligne d'échappement dans plist

Merci.

Répondre

97

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

+0

ajouter des sauts de ligne manuellement peut fonctionner si les fichiers sont statiques et peu nombreux. Mais pas vraiment une "vraie" solution (basée sur le code). Les seules solutions basées sur le code sont celles de Mihai Damian et justAfix. – Anshu

+0

+1 qui a fait l'affaire! Je vous remercie! – Jean

+0

Cela semble fonctionner très bien pour iOS 7 avec UILabel, mais cela ne semble pas fonctionner avec iOS 6.J'utilise 'option + return' dans le plist, mais mon UILabel dans iOS 6 n'a pas le saut de ligne. Est-ce que quelqu'un d'autre voit ce comportement? – njkremer

19

Modifiez votre plist à l'aide d'un éditeur de texte au lieu de l'éditeur de plistes de Xcode. Ensuite, vous mettez simplement les sauts de ligne dans vos cordes directement:

<string>foo 
bar</string> 
+0

Merci pour la suggestion! –

+0

Parfois, les solutions les plus simples sont les meilleures – MandisaW

4

un peu en retard, mais j'ai découvert le même problème et j'ai également découvert un correctif ou une solution de contournement. Donc le problème est lorsque vous lisez une chaîne à partir d'un fichier, \ n sera 2 caractères contrairement à xcode le compilateur reconnaîtra \ n comme un.

donc j'é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 utiliser il:

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

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

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

+0

Cela fonctionne; Je me demande s'il n'y a pas de solution plus facile, cependant. –

+0

superbe réparation. Et une observation intéressante. M'a sauvé des jours d'effort. C'est essentiellement la même chose que la solution de Mihai Damian, mais celle-ci explique vraiment la raison derrière cela. – Anshu

34

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 telle sorte que le texte du plist est rendu in extenso. Ce code supprime effectivement l'échappement supplémentaire.

0

Voici comment je charger mon plist à 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 
} 

get donc je suis la valeur plist stockée dans le xxRaw variable, puis recherchez __ "double undescore" et remplacez-le par "\ r", c'est-à-dire retour chariot pour une nouvelle ligne et ceci est placé dans la variable finale.