2010-10-02 3 views
7

Desidero poter cercare una stringa senza caratteri. Il problema è che la tastiera predefinita non mostra il pulsante di ricerca, quando non c'è nulla di scritto in UISearchBar.iPhone: UISearchBar come cercare "" String?

Qualche idea?

Grazie, Markus

+0

Perché vuoi per la ricerca di niente? – BoltClock

+5

perché una stringa di ricerca vuota restituisce tutto ... la ricerca è come un filtro ... – Markus

risposta

18

Fortunatamente, mi è capitato di lavorare sul codice che fa esattamente questo. E 'un po' di un hack, ma è possibile trovare l'UITextField che è incorporato all'interno della UISearchBar, quindi spegnere enablesReturnKeyAutomatically:

UITextField *searchBarTextField = nil; 
for (UIView *subview in searchBar.subviews) 
{ 
    if ([subview isKindOfClass:[UITextField class]]) 
    { 
     searchBarTextField = (UITextField *)subview; 
     break; 
    } 
} 
searchBarTextField.enablesReturnKeyAutomatically = NO; 
+0

Anche a me piace questa risposta, ma non penso che sia intuitiva dal punto di vista dell'esperienza utente. – Jordan

+1

l'ho usato per un altro scopo: aprire la tastiera per impostazione predefinita quando si visualizza per la prima volta una vista con una UISearchBar, chiamando [searchBarTextField becomeFirstResponder]. Un vero mistero per il fatto che non sovraccaricassero diventati FirstResponder per UISearchBar per fare la cosa giusta e mostrare la tastiera. Grazie! –

1

Tipo * e l'uso che come segnaposto nel vostro programma per "" (niente).

0

La ricerca di "" è come cercare nil/NULL: la query restituirà tutte le voci vuote o nulle.

Il * è un jolly carattere utilizzato nella maggior parte dei markup la ricerca e si tornerà tutte le partite.

+1

Giusto per chiarire ulteriormente, '" "" è ** non ** nil/NULL, ma è considerato la * stringa nulla * (vuoto stringa). – Sean

+0

Normalmente con l'aggiunta di più caratteri, il set filtrato si riduce in conteggio. Di conseguenza, se tutti i caratteri di ricerca vengono rimossi, ciò che dovrebbe accadere "naturalmente" è che viene restituito l'intero set non filtrato. vale a dire. la ricerca di nulla è intuitivamente più strettamente allineata con l'assenza di filtro. –

0

durante la ricerca di un testo. è difficile cercare una stringa senza carattere ... quindi è necessario lavorare su

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    //write code here 
} 

verrà eseguito automaticamente

0

questo è quello che ho fatto

Per rimuovere la tastiera su backspace fino a vuoto :

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if ([searchText isEqualToString:@""]) { 
     [searchBar resignFirstResponder]; 
    } 
} 

sarà anche necessario impostare l'UITextField all'interno UISearchBar allo stesso delegato, ricordarsi di aggiungere a questo delegato (in m contesto del codice y il delegato è auto)

for (UIView *view in searchBar.subviews){ 
     if ([view isKindOfClass: [UITextField class]]) { 
      UITextField *tf = (UITextField *)view; 
      tf.delegate = self; 
      break; 
     } 
    } 

dopo che aggiungono questi per il delegato

- (void)searchBarCancelButtonClicked:(UISearchBar *) aSearchBar { 
    [aSearchBar resignFirstResponder]; 
} 

-(BOOL)textFieldShouldClear:(UITextField *)textField 
{ 
    [self performSelector:@selector(searchBarCancelButtonClicked:) withObject:textField.superview afterDelay: 0.1]; 
    return YES; 
} 

quando uno di questi grilletto, eseguire la ricerca per "" stringa

7

Daniels risposta funziona perfettamente fino a iOS 7.

iOS 7 Aggiornamento

- (void)searchBarTextDidBeginEditing:(UISearchBar *) bar 
{ 
    UITextField *searchBarTextField = nil; 

    NSArray *views = ([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0f) ? bar.subviews : [[bar.subviews objectAtIndex:0] subviews]; 

    for (UIView *subview in views) 
    { 
     if ([subview isKindOfClass:[UITextField class]]) 
     { 
      searchBarTextField = (UITextField *)subview; 
      break; 
     } 
    } 
    searchBarTextField.enablesReturnKeyAutomatically = NO; 
}