2010-01-10 101 views
44

我正在編寫一個屬性列表,使其位於我的應用程序的資源包中。 plist中的NSString對象需要在其中存在換行符。我試過\n,但那不起作用。我該如何在plist的字符串中添加換行符?NSString:換行符中的換行符

謝謝。

回答

97

如果您正在編輯在Xcode的inbuild的plist編輯plist中,您可以按選項返回到輸入字符串值中的換行符。

+0

手動添加換行符可能會在文件靜態且很少的情況下起作用。但不是真正的「基於代碼」的解決方案。唯一的基於代碼的解決方案是來自Mihai Damian和justAfix的解決方案。 – Anshu 2012-02-24 10:25:17

+0

+1了!謝謝! – Jean 2012-07-27 15:44:22

+0

這似乎在UILabel的iOS 7中工作得很好,但是它似乎不適用於iOS 6。我在plist中使用'option + return',但是我的UILabel在iOS 6中沒有換行符。有沒有人看到這種行爲? – njkremer 2013-12-09 22:23:01

19

使用文本編輯器而不是Xcode的plist編輯器編輯你的plist。然後你只需把換行符在你的字符串直接:

<string>foo 
bar</string> 
+0

感謝您的建議! – 2010-01-14 02:26:07

+0

有時最簡單的解決方案最好 – MandisaW 2017-03-17 16:08:05

4

有點晚,但我發現了同樣的問題,我也發現了一個修復或解決方法。 這樣的人誰在這個跌倒會得到一個答案:)

所以這個問題是當你從文件中讀取一個字符串,\ n將完全不同於2個字符在Xcode編譯器將\ n識別爲一個。

,所以我擴展了NSString類是這樣的:

「的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 

如何使用它:

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

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

它的快速和骯髒,請注意,您的文件\ n不會被識別爲\ n因此,如果您需要在文本上編寫\ n您必須修改方法:)

+0

這工作;不過,我想知道是否沒有更簡單的解決方案。 – 2010-08-20 07:43:15

+0

高超的修復。有趣的觀察。爲我節省了數日的努力。它與Mihai Damian的解決方案基本相同,但這真的解釋了它背後的原因。 – Anshu 2012-02-24 10:17:18

34

我發現了一個更簡單的解決方案:

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

看來串逃脫讀者需要的所有字符轉義,使得從plist中的文本逐字渲染。此代碼有效地降低了額外的轉義。

0

這是我做的如何加載我的plist在雨燕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> 

雨燕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 
} 

所以我第一次得到存儲的plist值到xxRaw變量,然後搜索__「double undescore」並用「\ r」代替,例如回車換行,並將其放入最終變量中。