2009-07-06 49 views
25

我想计算Objective-C中NSString的行数。如何计算Objective-C字符串(NSString)中的行数?

NSInteger lineNum = 0; 
    NSString *string = @"abcde\nfghijk\nlmnopq\nrstu"; 
    NSInteger length = [string length]; 
    NSRange range = NSMakeRange(0, length); 
    while (range.location < length) { 
     range = [string lineRangeForRange:NSMakeRange(range.location, 0)]; 
     range.location = NSMaxRange(range); 
     lineNum += 1; 
    } 

有没有更简单的方法?

回答

33

好,一个不是很有效,但尼斯(ISH)寻找方法是

NSString *string = @"abcde\nfghijk\nlmnopq\nrstu"; 
NSInteger length = [[string componentsSeparatedByCharactersInSet: 
           [NSCharacterSet newlineCharacterSet]] count]; 
+0

谢谢! ! 在上面的情况下,如何编码? 对不起,我编程 – freddiefujiwara 2009-07-06 05:36:57

+4

请记住,如果字符串非常长,这将比您发布在问题中的代码效率低很多*,因为它会为每一行创建一个新的字符串对象。请确保你明白性能是多么重要,你在做什么,以及字符串大小的上限是什么。 – smorgan 2009-07-06 14:52:39

43

苹果公司建议使用此方法:

NSString *string; 
unsigned numberOfLines, index, stringLength = [string length]; 

for (index = 0, numberOfLines = 0; index < stringLength; numberOfLines++) 
    index = NSMaxRange([string lineRangeForRange:NSMakeRange(index, 0)]); 

article。他们还解释了如何计算包装文本的行数。

3

如果要考虑到文本的宽度,你可以用TextKit(iOS7 +)做到这一点:

func numberOfLinesForString(string: String, size: CGSize, font: UIFont) -> Int { 
    let textStorage = NSTextStorage(string: string, attributes: [NSFontAttributeName: font]) 

    let textContainer = NSTextContainer(size: size) 
    textContainer.lineBreakMode = .ByWordWrapping 
    textContainer.maximumNumberOfLines = 0 
    textContainer.lineFragmentPadding = 0 

    let layoutManager = NSLayoutManager() 
    layoutManager.textStorage = textStorage 
    layoutManager.addTextContainer(textContainer) 

    var numberOfLines = 0 
    var index = 0 
    var lineRange : NSRange = NSMakeRange(0, 0) 
    for (; index < layoutManager.numberOfGlyphs; numberOfLines++) { 
     layoutManager.lineFragmentRectForGlyphAtIndex(index, effectiveRange: &lineRange) 
     index = NSMaxRange(lineRange) 
    } 

    return numberOfLines 
}