objective-c cocoa newline enumeration

objective c - ¿Cómo contar el número de líneas en una cadena de Objective-C(NSString)?



cocoa newline (3)

Quiero contar las líneas en un NSString en Objective-C.

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

hay una manera mas facil?


bueno, una forma no muy eficiente, pero agradable (ish) es

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


Si desea tener en cuenta el ancho del texto, puede hacerlo con 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 }


Apple recomienda este método:

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

Ver el artículo . También explican cómo contar las líneas de texto envuelto.