2009-07-06 69 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 
}