NSString: перевод строки в plist - PullRequest
49 голосов
/ 10 января 2010

Я пишу список свойств, которые будут в комплекте ресурсов моего приложения. Объект NSString в списке должен иметь разрывы строк. Я пытался \n, но это не работает. Что мне делать, чтобы в моей строке в списке были новые строки?

Спасибо.

Ответы [ 5 ]

110 голосов
/ 24 февраля 2010

Если вы редактируете plist во встроенном редакторе plist Xcode, вы можете нажать option-return, чтобы ввести разрыв строки в строковом значении.

36 голосов
/ 20 августа 2010

Я нашел более простое решение:

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

Кажется, что программа чтения строк экранирует все символы, которые должны быть экранированы, так что текст из plist представляется дословно Этот код эффективно удаляет лишний выход.

21 голосов
/ 10 января 2010

Отредактируйте ваш список с помощью текстового редактора вместо редактора списков Xcode Затем вы просто вставляете разрывы строк в свои строки напрямую:

<string>foo
bar</string>
4 голосов
/ 24 июня 2010

немного поздно, но я обнаружил ту же проблему и обнаружил исправление или обходной путь. так что для любого, кто наткнется на это, получит ответ:)

проблема в том, что когда вы читаете строку из файла, \ 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 голосов
/ 15 января 2016

Вот как я загружаю свой лист в 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
}

Поэтому я сначала сохраняю сохраненное значение plist в переменную xxRaw, а затем ищу __ "double undescore" и заменяю его на "\ r", то есть возврат каретки для новой строки, который помещается в конечную переменную.

...