【问题标题】:NSString: newline escape in plistNSString:plist 中的换行符转义
【发布时间】:2011-01-03 09:10:00
【问题描述】:

我正在编写一个属性列表以放在我的应用程序的资源包中。 plist 中的NSString 对象需要有换行符。我试过\n,但这不起作用。如何在 plist 中的字符串中添加换行符?

谢谢。

【问题讨论】:

    标签: iphone nsstring plist


    【解决方案1】:

    如果您在 Xcode 的内置 plist 编辑器中编辑 plist,您可以按 option-return 在字符串值中输入换行符。

    【讨论】:

    • 如果文件是静态的且很少,手动添加换行符可能会起作用。但并不是真正的“真正”(基于代码)的解决方案。唯一基于代码的解决方案是来自 Mihai Damian 和 justAfix 的解决方案。
    • 这似乎对我来说在带有 UILabel 的 iOS 7 中工作得很好,但它似乎不适用于 iOS 6。我在 plist 中使用option+return,但我的 UILabel在 iOS 6 中没有换行符。有其他人看到这种行为吗?
    • 我没有在我的键盘上找到 option-return 键。我单击 plist 文件中的行并按下键盘上的 Option+Enter 键,但似乎没有任何变化。我该怎么办?
    • 很好的答案。为我节省了很多时间。谢谢!!
    【解决方案2】:

    我找到了一个更简单的解决方案:

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

    似乎字符串阅读器转义了所有需要转义的字符,以便 plist 中的文本逐字呈现。此代码有效地删除了额外的转义。

    【讨论】:

      【解决方案3】:

      使用文本编辑器而不是 Xcode 的 plist 编辑器来编辑您的 plist。然后,您只需直接在字符串中添加换行符:

      <string>foo
      bar</string>
      

      【讨论】:

      • 有时最简单的解决方案是最好的
      • 在 Xcode plist 文件中直接按 Enter 键的同时按住 Option/Alt 键可以获得相同的效果。
      【解决方案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 你必须修改方法:)

      【讨论】:

      • 极好的修复。和有趣的观察。节省了我几天的精力。它与 Mihai Damian 的解决方案基本相同,但这一个确实解释了其背后的原因。
      【解决方案5】:

      这就是我在 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>
      

      斯威夫特 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" 即换行符的回车并将其放入最终变量中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-12
        • 1970-01-01
        • 1970-01-01
        • 2012-12-14
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        • 1970-01-01
        相关资源
        最近更新 更多