2009-01-23 13 views
23

Estoy buscando determinar si un valor de cadena de una entrada de usuario (UITextField) está "en blanco" si no es nulo. Comprobar si [textField.text isEqualToString:""] no es suficiente porque quiero evitar cualquier entrada en blanco/en blanco (como por ejemplo, algunos caracteres de espacio).¿Cuál es la mejor manera de recortar el espacio en blanco de una cuerda en Cocoa Touch?

Parece haber una indicación de una buena solución para mi problema particular in this StOv post.

Básicamente es algo como esto, pero sospecho que tiene que (o debería) haber una mejor manera:

NSString *strResult; 
NSScanner* scanner = [NSScanner scannerWithString:textField.text]; 
BOOL hasValidChars = [scanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet] 
              intoString:&strResult]; 

// if hasValidChars == YES, we've got nonwhite space chars collected into strResult 

Esto claramente sólo funciona para mi circunstancia particular, e incluso entonces sería un error si el primer personaje era un espacio, pero seguí los datos que quería. Entonces, me doy cuenta de que Ruby me ha echado a perder un poco, pero debe haber un idioma probado y verdadero para recortar cadenas en Cocoa.

Aaaand la respuesta ya está ahí fuera, mis disculpas:

de -stringByTrimmingCharactersInSet: NSString lo haría:

devuelve una nueva cadena hecha mediante la eliminación de desde ambos extremos del receptor caracteres contenidos en un conjunto de caracteres dado .

Tengo curiosidad por saber si alguien tiene otras formas/preferidas de hacerlo.

+0

string.length> 0 – elliotrock

Respuesta

48

Está usando whitespaceAndNewlineCharacterSet, bien. Pero en lugar de usar scanUpToCharactersFromSet, ¿por qué no utilizar stringByTrimmingCharactersInSet? Algo como esto ...

strResult = [strResult stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

EDIT: ¿No te das cuenta de que ya encontró stringByTrimmingCharactersInSet hasta después de que he publicado esto.

+1

no se preocupe, alguien debe recibir el crédito para la respuesta, y me siento como una herramienta de publicar yo mismo ;-) –

+0

Una pregunta sobre el cadena de resultados Parece que es una cadena lanzada automáticamente. Entonces debería ser liberado después del uso, ¿verdad? –

+0

Gracias amigo. de mucha ayuda. Gracias una vez más –

13

Lo que se busca es

[string stringByReplacingOccurrencesOfString:@" " withString:@""].

Eliminar el espacio en blanco en el medio de una cadena no se llama 'recorte'.

El recorte por definición funciona desde los bordes.

2

Para hacer esto más fácil en sí mismo y en lugar de hacer una subclase, puede modificar clases de Apple existentes y hacer algo como

// 
// NSString+MyExtensions.h 
// 

@interface NSString (MyExtensions) 

- (NSString *)trimmed; 

@end 

y la implementación

// 
// NSString+MyExtensions.m 
// 

#import "NSString+MyExtensions.h" 

@implementation NSString (MyExtensions) 

- (NSString *)trimmed { 
    return [self stringByTrimmingCharactersInSet: 
      [NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
} 

@end 

Así que ahora cualquier lugar de su aplicación que utiliza un NSString,
ahora puede llamar al [@" hello world " trimmed] como por debajo de

// 
// ViewController.m 
// 

#import "NSString+MyExtensions.h" 

@implementation ViewController 

- (void)viewDidLoad { 

    NSString *string = @"  This is a string "; 

    NSLog(@"The original string: %@ \n The trimmed string: %@\n\n", 
      string, 
      [string trimmed]); 

    string = @"     "; 

    if([string trimmed].length == 0) 
     NSLog(@"%@", @"String is empty! :O"); 

} 

@end 

cual sería imprimir

The original string:  This is a string  
The trimmed string: This is a string 

String is empty! :O 
Cuestiones relacionadas