2009-05-29 15 views
35

Ho un UISearchBar nella mia interfaccia e voglio personalizzare il comportamento del piccolo pulsante di cancellazione che appare nella barra di ricerca dopo che è stato inserito del testo (è un piccolo cerchio grigio con una croce in esso, appare su il lato destro del campo di ricerca).Posso collegarmi a Clear Button di UISearchBar?

Fondamentalmente, voglio non solo cancellare il testo della barra di ricerca (che è l'implementazione predefinita) ma anche cancellare alcune altre cose dalla mia interfaccia, ma chiamando uno dei miei metodi.

Non riesco a trovare nulla nei documenti per la classe UISearchBar o il protocollo UISearchBarDelegate - non sembra possibile accedere direttamente a questo comportamento.

L'unica cosa che ho fatto notare è che i documenti hanno spiegato che il metodo delegato:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText; 

è chiamato dopo che il pulsante chiaro è sfruttato.

Inizialmente ho scritto del codice in quel metodo che controllava la proprietà di testo della barra di ricerca, e se era vuoto, allora era stato cancellato e fare tutte le mie altre cose.

Due problemi che questo, però:

In primo luogo, per qualche motivo non riesco a capire, anche se dico la barra di ricerca per resignFirstResponder alla fine del mio metodo, qualcosa, da qualche parte è l'impostazione di nuovo a becomeFirstResponder. Davvero fastidioso ...

In secondo luogo, se l'utente non utilizza il pulsante Cancella e semplicemente elimina il testo nella barra utilizzando il pulsante Elimina sulla tastiera, questo metodo viene disattivato e i risultati della ricerca scompaiono. Non bene.

Qualsiasi consiglio o suggerimento nella giusta direzione sarebbe fantastico!

Grazie!

risposta

1

Suggerirei di utilizzare i metodi rightView e rightViewMode di UITextField per creare il proprio pulsante di cancellazione che utilizza la stessa immagine. Presumo ovviamente che UISearchBar ti permetterà di accedere al campo UIText all'interno di esso. Penso che lo farà.
essere consapevoli di questo dal Reference Library iPhone OS:

If an overlay view overlaps the clear button, however, the clear button always takes precedence in receiving events. By default, the right overlay view does overlap the clear button.

per cui è probabile anche bisogno di disattivare il tasto originale chiaro.

+1

Sono abbastanza sicuro l'UISearchBar non espone è texfield ... – Jasarien

7

Ho questo codice nella mia app. La differenza è che io non sostengo 'di ricerca dal vivo', ma invece avviare la ricerca quando l'utente tocca il pulsante di ricerca sulla tastiera:

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { 
    if ([searchBar.text isEqualToString:@""]) { 
     //Clear stuff here 
    } 
} 
+0

1 Sono d'accordo con questa risposta. Se il testo è vuoto, dopo essere stato cancellato, significa che è stato premuto il pulsante di cancellazione. @Jasarien hai trovato una soluzione? – JoePasq

+0

uso Surley - (vuoto) searchBar: (UISearchBar *) searchBar textDidChange: (NSString *) searchText invece, altrimenti se hai bisogno di rassegnare il primo risponditore in chiaro, l'utente non sarà mai in grado di selezionare la casella, poiché sarà vuoto quando inizieranno. – Marc

1

Dal momento che questo viene in su prima, e per quanto posso vedere la questione non era veramente in modo adeguato indirizzato, ho pensato di pubblicare la mia soluzione.

1) È necessario ottenere un riferimento al campo di testo all'interno della barra di ricerca 2) È necessario rilevare il campo di testo libero quando viene attivato.

Questo è piuttosto semplice. Ecco un modo.

a) Assicurarsi di creare la classe a, poiché si utilizzerà il metodo delegato del campo testo all'interno della barra di ricerca. b) Inoltre, collega la tua barra di ricerca a un punto vendita della tua classe. Ho appena chiamato il mio searchBar. c) da viewDidLoad si desidera ottenere il campo di testo all'interno della barra di ricerca. L'ho fatto così.

UITextField *textField = [self.searchBar valueForKey:@"_searchField"]; 
if (textField) { 
    textField.delegate = self; 
    textField.tag = 1000; 
} 

Avviso, ho assegnato un tag che textField modo che io possa prendere di nuovo, e mi ha fatto un delegato textField. Potresti aver creato una proprietà e assegnato questo campo di testo a quella proprietà per recuperarla in seguito, ma ho usato un tag.

Da qui è solo bisogno di chiamare il metodo delegato:

-(BOOL)textFieldShouldClear:(UITextField *)textField { 
if (textField.tag == 1000) { 
    // do something 
    return YES; 
} 
return NO; 

}

Questo è tutto. Dato che ti stai riferendo a un valore privatoForKey, non posso garantire che non ti metterà nei guai.

+1

Grazie mille amico – SampathKumar

0

migliore soluzione dalla mia esperienza è solo quello di mettere un UIButton (con sfondo chiaro e senza testo) al di sopra del pulsante di azzeramento sistema e di collegare un IBAction

- (IBAction)searchCancelButtonPressed:(id)sender { 

    [self.searchBar resignFirstResponder]; 
    self.searchBar.text = @""; 

    // some of my stuff 
    self.model.fastSearchText = nil; 
    [self.model fetchData]; 
    [self reloadTableViewAnimated:NO]; 

} 
17

trovato la soluzione migliore per questo problema :)

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 
    if ([searchText length] == 0) { 
     [self performSelector:@selector(hideKeyboardWithSearchBar:) withObject:searchBar afterDelay:0]; 
    } 
} 

- (void)hideKeyboardWithSearchBar:(UISearchBar *)searchBar{ 
    [searchBar resignFirstResponder]; 
} 
+0

Tnx buon trucco, ho aggiunto la versione Swift 2 come risposta sotto – ergunkocak

1

Si potrebbe provare questo:

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

- (BOOL)textFieldShouldClear:(UITextField *)textField { 
    // your code 
    return YES; 
} 
+2

Non funziona per me su iOS 9 con Swift 2. Si blocca con errore '_searchController]: selettore non riconosciuto inviato all'istanza' – Sunkas

0

non era in grado di pinna d una soluzione qui che non utilizzava un'API privata o non era in prova di aggiornamento in caso Apple modifica la struttura della vista di UISearchBar. Ecco quello che ho scritto che funziona:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UITextField* textfield = [self findTextFieldInside:self.searchBar]; 
    [textfield setDelegate:self]; 
} 

- (UITextField*)findTextFieldInside:(id)mainView { 
    for (id view in [mainView subviews]) { 
     if ([view isKindOfClass:[UITextField class]]) { 
      return view; 
     } 

     id subview = [self findTextFieldInside:view]; 
     if (subview != nil) { 
      return subview; 
     } 
    } 

    return nil; 
} 

quindi implementare il protocollo UITextFieldDelegate nella tua classe e sovrascrivere il textFieldShouldClear: metodo.

- (BOOL)textFieldShouldClear:(UITextField*)textField { 
    // Put your code in here. 
    return YES; 
} 

Edit: Impostazione del delegato sul campo di testo di una barra di ricerca in iOS 8 produrrà un incidente. Tuttavia sembra la searchBar: textDidChange: il metodo verrà chiamato su iOS8 in chiaro.

6

movimentazione stretta tastiera sul pulsante chiaro scatto versione Swift:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 
    if searchText.characters.count == 0 { 
     performSelector("hideKeyboardWithSearchBar:", withObject:searchBar, afterDelay:0) 
    } 
} 

func hideKeyboardWithSearchBar(bar:UISearchBar) { 
    bar.resignFirstResponder() 
} 
Problemi correlati