拆分归因字符串并保留格式

Den*_*Vog 3 objective-c nsattributedstring ios ios8

如何在保持格式化的同时,根据预定义的分隔符获取现有的NSAttributedString并将其划分?看起来componentsSeparatedByString似乎不会在NSAttributedString上运行.

我当前的解决方法在正确的点生成拆分,但只输出NSString.因此失去格式.

NSData *rtfFileData = [NSData dataWithContentsOfFile:path];
NSAttributedString *rtfFileAttributedString = [[NSAttributedString alloc] initWithData:rtfFileData options:@{NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType} documentAttributes:nil error:nil];
NSString *rtfFileString = [rtfFileAttributedString string];
NSString *importSeparator = @"###";
// Wish I could do this
// NSArray *separatedArray = [rtfFileAttributedString componentsSeparatedByString:importSeparatorPref];
NSArray *separatedArray = [rtfFileString componentsSeparatedByString:importSeparatorPref];
NSLog( @"Separated array: %@", separatedArray );
Run Code Online (Sandbox Code Playgroud)

rma*_*ddy 11

您可以使用拆分非属性字符串来拆分属性字符串.一种选择是:

NSData *rtfFileData = [NSData dataWithContentsOfFile:path];
NSAttributedString *rtfFileAttributedString = [[NSAttributedString alloc] initWithData:rtfFileData options:@{NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType} documentAttributes:nil error:nil];
NSString *rtfFileString = [rtfFileAttributedString string];
NSString *importSeparator = @"###";
NSArray *separatedArray = [rtfFileString componentsSeparatedByString:importSeparatorPref];

NSMutableArray *separatedAttributedArray = [NSMutableArray arrayWithCapacity:separatedArray.count];
NSInteger start = 0;
for (NSString *sub in separatedArray) {
    NSRange range = NSMakeRange(start, sub.length);
    NSAttributedString *str = [rtfFileAttributedString attributedSubstringFromRange:range];
    [separatedAttributedArray addObject:str];
    start += range.length + importSeparator.length;
}

NSLog(@"Separated attributed array: ", separatedAttributedArray);
Run Code Online (Sandbox Code Playgroud)


Ken*_* W. 5

在 Swift 4 中,我创建了这个函数。

func splitAttributedString(inputString: NSAttributedString, seperateBy: String) -> [NSAttributedString] {
    let input = inputString.string
    let separatedInput = input.components(separatedBy: seperateBy)
    var output = [NSAttributedString]()
    var start = 0
    for sub in separatedInput {
        let range = NSMakeRange(start, sub.utf16.count)
        let attribStr = inputString.attributedSubstring(from: range)
        output.append(attribStr)
        start += range.length + seperateBy.count
    }
    return output
}
Run Code Online (Sandbox Code Playgroud)

  • 如果字符串包含任何表情符号或某些其他特殊字符,此操作将会失败。将 `let range = NSMakeRange(start, sub.count)` 替换为 `let range = NSMakeRange(start, sub.utf16.count)` 以使其适用于任何字符串。 (2认同)