2014-06-05 18 views
6

enter image description hereenter image description hereCome si mantiene il pulsante Annulla nella barra di ricerca abilitata quando la tastiera viene chiusa?

Sto cercando di ottenere lo stesso effetto dell'app Contatti di Apple (immagine a sinistra). Il pulsante Annulla in UISearchBar è abilitato anche quando la tastiera viene chiusa. La mia app si comporta in modo diverso (schermata destra). Il pulsante Annulla si disabilita automaticamente quando la tastiera viene chiusa. L'utente è costretto a premere il pulsante Annulla una volta per abilitarlo e quindi un'altra volta per attivare effettivamente il licenziamento. Questa non è una buona esperienza utente. Come faccio a mantenere sempre abilitato il pulsante Annulla come l'app Contatti di Apple?

Informazioni tecniche:

non sto usando UISearchDisplayController causa di alcuni requisiti di progettazione. Questo è solo un UISearchBar con il mio controller di ricerca personalizzato. Il pulsante Annulla viene visualizzato utilizzando [self.searchBar showsCancelButton:YES animated:YES]. La tastiera viene chiusa utilizzando [self.searchBar resignFirstResponder].

+0

Per una risposta robusta, vedere qui: https://stackoverflow.com/questions/9968595/how-to-enable-cancel-button-with-uisearchbar/47617904#47617904 –

risposta

1

Si potrebbe fare questo:

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { 
    [self enableCancelButton]; 
} 

- (void)enableCancelButton { 
    for (UIView *view in _seachBar.subviews) { 
     if ([view isKindOfClass:[UIButton class]]) { 
      [(UIButton *)view setEnabled:YES]; 
     } 
    } 
} 

MA Questo è un metodo abbastanza hackish e sono abbastanza certo è generalmente malvista da Apple e potrebbe potenzialmente portare al app essere respinto. Per quanto ne so, non sembra esserci alcun altro modo per fare ciò che stai cercando di fare.

2

Da iOS 7 tutte le sottoview di UISearchBar sono un livello più profondo. Questo dovrebbe funzionare:

for (UIView *subView in searchBar.subviews) { 
    for (UIView *secondLevelSubview in subView.subviews) { 
     if ([view isKindOfClass:[UIButton class]]) { 
      [(UIButton *)view setEnabled:YES]; 
     } 
} 

Ancora hacky e può facilmente rompere nella prossima versione di iOS.

5

È possibile utilizzare l'API di runtime per accedere al pulsante Annulla.

UIButton *btnCancel = [self.searchBar valueForKey:@"_cancelButton"]; 
[btnCancel setEnabled:YES]; 

Per quanto riguarda la tua domanda è interessato, non c'è modo è possibile attivare il pulsante Annulla quando la tastiera è respinto, come non c'è richiamata in quanto tale.

0

Implementare il seguente metodo searchBarShouldEndEditing delegate nel codice. Spero che sarà utile

(BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar 
{ 
    [[searchBar valueForKey:@"_cancelButton"] setEnabled:YES]; 
    return YES; 
} 
+0

Per me, il cancelButton è ancora abilitato in quel punto, quindi non aiuta ad abilitarlo qui. –

3

Chiama a [self.searchBar resignFirstResponder] farà disattivare il pulsante Annulla. Quindi, devi sempre aggiornare il pulsante Annulla per abilitarlo dopo averlo chiamato.

Objective-C

[searchBar resignFirstResponder]; 
UIButton *cancelButton = (UIButton *)[searchBar valueForKey:@"cancelButton"]; 
[cancelButton setEnabled:YES]; 

Swift

searchBar.resignFirstResponder() 
if let cancelButton = searchBar.value(forKey: "cancelButton") as? UIButton 
    cancelButton.isEnabled = true 
} 

Nella mia esperienza, view.endEditing(true) è il problema. Perché è anche chiamato .resignFirstResponder se c'è un UITextField all'interno della vista, che è contenuto in UISearchBar.

https://developer.apple.com/reference/uikit/uiview/1619630-endediting

1

Ecco una soluzione ricorsiva che sta lavorando per me.

func enableButtons(_ view:UIView) { for subView in view.subviews { enableButtons(subView) } if let buttonView = view as? UIButton { buttonView.isEnabled = true } }

Problemi correlati