2009-07-06 23 views
25

Satır-C'deki NSString'deki satırları saymak istiyorum.Bir Objective-C dizesinde (NSString) satır sayısı nasıl sayılır?

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; 
    } 

Daha kolay bir yol var mı?

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

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

article bakınız:

cevap

33

iyi bir değil çok verimli, ama seyir (imsi) güzel bir yol Elma bu yöntemi önerir

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

teşekkür ederiz! ! Yukarıdaki durumda, nasıl kodlanır? Programlama için yalvarıyorum özür dilerim – freddiefujiwara

+4

Dize çok uzunsa, her satır için yeni bir dize nesnesi oluşturacağından, bu soruda yazdığınız gibi koddan çok daha az verimli olacağını unutmayın. Performansın bu noktada nerede olduğunuzu ve dizge boyutunda üst sınırın ne olacağını anladığınızdan emin olun. – smorgan

43

olduğunu. Ayrıca sarılmış metin satırlarının nasıl sayılacağını da açıklar. Eğer dikkate metnin genişliğini almak istiyorsanız

+12

Modern kodda, NSUInteger kullanılmalıdır. –

+0

Harika bir çözüm .. –

+0

Muhtemelen örnek için dizeyi, sonsuz bir döngü olmadan sonsuz döngü başlatmak için iyi bir fikir olurdu. – malhal

3

, sen TextKit (iOS7 +) ile yapabilirsiniz:

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 
} 
İlgili konular