2011-12-08 10 views
6

¿Hay alguna manera de seleccionar todo el texto en UISearchBar? Intenté [searchBar selectALL:], pero arrojó la señal (selector no reconocido).UISearchBar seleccionar todo el texto

Quiero permitir que el usuario modifique el texto de búsqueda anterior. En algún momento, cuando el usuario simplemente comienza a escribir una nueva solicitud, la anterior debe ser descartada. La forma estándar de lograrlo: seleccione todo el texto en el momento en que el texto comience a editarse.

Respuesta

2

Aquí hay otra sugerencia: cuando alguien activa la barra de búsqueda, hay dos posibles intenciones: Escribir un nuevo texto o añadir al texto existente. Creo que deberías darle a tu usuario la opción.

Si quiere agregar texto, naturalmente vuelve a tocar al final del texto existente.

Si quiere comenzar de nuevo, puede presionar el botón Borrar que aparece automáticamente cuando la barra de búsqueda se activa.

+0

Bueno, es la mejor solución. –

+5

Este comportamiento difiere de Safari en iOS, que selecciona el texto al tocar la barra de direcciones. – Luke

0

No creo que haya un método para seleccionar todo el texto. Tal vez cuando hay un enfoque en UISearchBar puede borrar la barra de búsqueda como tal - searchBar.text = @""

es decir clara texto en la barra de búsqueda ... Espero que esto ayude de alguna manera ...

+0

En este caso no hay manera de usuario para alterar petición. Si es una cadena larga, puede ser molesto volver a escribirla. –

0

Usted puede lograr esto manteniendo un BOOL que indica si la edición del campo de texto de la barra de búsqueda acaba de comenzar. A continuación, puede ver la primera pulsación de tecla en los métodos de delegar SearchBar.

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { 
    firstEdit = YES; 
} 

- (BOOL)searchBar:(UISearchBar *)searchBar 
     shouldChangeTextInRange:(NSRange)range 
     replacementText:(NSString *)text { 

    if (firstEdit) { 
     searchBar.text = text; 
     firstEdit = NO; 
    } 
    return YES; 
} 
+0

¿Hay alguna manera de resaltar el texto? –

4

Si desea que el 'tipo de sustituir' funcionalidad que seleccionar el texto en el UITextField le da (es decir, la llave extra en la cruz es inaceptable), se puede excavar a través de los subvistas del UISearchBar para encontrar el UITextField (o UISearchBarTextField) y seleccione el texto:

// need to select the searchBar text ... 
UITextField * searchText = nil; 
for (UIView *subview in searchBar.subviews) 
{ 
    // we can't check if it is a UITextField because it is a UISearchBarTextField. 
    // Instead we check if the view conforms to UITextInput protocol. This finds 
    // the view we are after. 
    if ([subview conformsToProtocol:@protocol(UITextInput)]) 
    { 
     searchText = (UITextField*)subview; 
     break; 
    } 
} 

if (searchText != nil) 
    [searchText selectAll:self]; 
+2

Tenga en cuenta que esto ya no funciona en iOS 7: el campo de texto ahora está anidado más profundamente en la jerarquía de vistas. Para solucionar esto, simplemente cambie el código a una versión recursiva que atraviese la jerarquía hasta que encuentre el campo de texto. También podría haber un problema con el método "selectAll:", según lo que realmente desee lograr. [Vea esta pregunta para más detalles] (http://stackoverflow.com/questions/1689911/programatically-select-all-text-in-uitextfield). También tenga en cuenta que tuve que llamar esto en viewDidAppear, no viewWillAppear para que funcione. –

9

Esto se puede lograr utilizando la semántica UIResponder estándar. No es necesario profundizar en la jerarquía de vistas privadas de UISearchBar.

[[UIApplication sharedApplication] sendAction:@selector(selectAll:) to:nil from:nil forEvent:nil] 

Puede llamar a este desde cualquier lugar, y el selector selectAll: se ejecutará la cadena de respuesta para ver si los objetos responden a ella. Suponiendo que su barra de búsqueda es actualmente la primera que responde (si el usuario está escribiendo en ella), responderá y el resultado será todo el texto seleccionado. Si no, puede convertirlo en el primero en responder llamando al becomeFirstResponder en la barra de búsqueda.

[_mySearchBar becomeFirstResponder] 
[[UIApplication sharedApplication] sendAction:@selector(selectAll:) to:nil from:nil forEvent:nil] 
2

En mi caso, el envío de selectAll(_:) no funcionó inmediatamente después de llamar becomeFirstResponder.

trabajé alrededor de ella, espera un runloop:

Swift 2:

dispatch_async(dispatch_get_main_queue()) { 
    UIApplication.sharedApplication().sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, forEvent: nil) 
} 

Swift 3:

DispatchQueue.main.async(execute: { 
    UIApplication.sharedApplication().sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, forEvent: nil) 
}) 
Cuestiones relacionadas