2011-12-08 14 views
6

C'è un modo per selezionare tutto il testo in UISearchBar? Ho provato [searchBar selectALL:], ma lancia il segnale (selettore non riconosciuto).UISearchBar seleziona tutto il testo

Desidero consentire all'utente di modificare il testo di ricerca precedente. A un certo punto, quando l'utente inizia a digitare una nuova richiesta, quella precedente dovrebbe essere chiusa. Il modo standard per ottenerlo: seleziona tutto il testo nel momento in cui il testo inizia a modificarlo.

risposta

2

Ecco un altro suggerimento: quando qualcuno attiva la barra di ricerca, ci sono due possibili intenzioni: digitare il nuovo testo o aggiungere al testo esistente. Penso che dovresti dare la scelta all'utente.

Se vuole aggiungere del testo, tocca di nuovo in modo naturale alla fine del testo esistente.

Se vuole ricominciare, può premere il pulsante di cancellazione che appare automaticamente quando la barra di ricerca diventa attiva.

+0

Bene, è la soluzione migliore. –

+5

Tuttavia, questo comportamento è diverso da Safari su iOS, che seleziona il testo quando si tocca la barra degli indirizzi. – Luke

0

Non penso che ci sia un metodo per selezionare tutto il testo. Forse quando v'è un focus su UISearchBar è possibile cancellare la barra di ricerca in questo modo - searchBar.text = @""

cioè testo in chiaro nella barra di ricerca ... Spero che questo aiuti in qualche modo ...

+0

In questo caso non v'è alcun modo per l'utente di modificare richiesta. Se è una stringa lunga può essere fastidioso ridigitarla. –

0

È possibile ottenere questo risultato mantenendo un BOOL che indica se la modifica del campo di testo della barra di ricerca è appena iniziata. Quindi, puoi prendere la prima pressione dei tasti nei metodi del delegato della ricerca.

- (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

C'è un modo per evidenziare il testo? –

4

Se si desidera che il 'tipo di sostituire' funzionalità che la selezione del testo nella UITextField ti dà (vale a dire il rubinetto in più sulla croce è inaccettabile), si può scavare attraverso le subviews del UISearchBar per trovare l'UITextField (o UISearchBarTextField) e selezionare il suo testo:

// 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

Si noti che questo non funziona più in iOS 7 - il campo di testo è ora nidificato più in profondità nella gerarchia della vista. Per risolvere questo problema, è sufficiente modificare il codice in una versione ricorsiva che attraversa la gerarchia fino a quando non trova il campo di testo. Potrebbe esserci anche un problema con il metodo "selectAll:", a seconda di cosa si vuole effettivamente ottenere. [Leggi questa domanda per maggiori dettagli] (http://stackoverflow.com/questions/1689911/programatically-select-all-text-in-uitextfield). Nota anche che dovevo chiamare questo in viewDidAppear, non viewWillAppear per farlo funzionare. –

9

questo può essere realizzato utilizzando la semantica UIResponder standard. Non c'è bisogno di scavare nella gerarchia della vista privata di UISearchBar.

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

È possibile chiamare questo da qualsiasi luogo, e il selettore selectAll: verrà eseguito la catena risponditore per vedere se gli oggetti rispondono ad essa. Supponendo che la tua barra di ricerca sia attualmente la prima a rispondere (se l'utente ci sta digitando), risponderà e il risultato sarà tutto il testo selezionato. Altrimenti puoi farlo come primo interlocutore chiamando becomeFirstResponder nella barra di ricerca.

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

Nel mio caso, l'invio selectAll(_:) non ha funzionato subito dopo la chiamata becomeFirstResponder.

ho lavorato intorno ad esso, attendi 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) 
}) 
Problemi correlati