2009-07-06 12 views
25

Quiero contar las líneas en un NSString en Objective-C.¿Cómo contar el número de líneas en una cadena de 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; 
    } 

¿Hay alguna manera más fácil?

Respuesta

33

así, de una manera no muy eficiente, pero agradable (más o menos) a buscar es

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

Gracias! ! En caso de arriba, ¿cómo codificar? Lo siento, soy principiante de la Programación – freddiefujiwara

+4

Tenga en cuenta que si la cadena es muy larga, será * mucho * menos eficiente que el código como lo que publicó en la pregunta, ya que creará un nuevo objeto de cadena para cada línea. Asegúrese de comprender qué tan importante es el rendimiento en el lugar donde lo hace y cuál será el límite superior en el tamaño de la cadena. – smorgan

43

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)]); 

Véase el article. También explican cómo contar las líneas de texto envuelto.

+12

En código moderno, uno debe usar NSUInteger. –

+0

Solución fantástica .. –

+0

Probablemente sería una buena idea inicializar la cadena para la muestra, bucle infinito sin una comprobación nula. – malhal

3

Si usted quiere tomar en cuenta el ancho del texto, puede hacer esto 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 
} 
Cuestiones relacionadas