2011-01-18 15 views
18

Ho un UIViewController con UISearchBar. Ho sostituito il pulsante Cerca con un pulsante Fine.iphone UISearchBar Pulsante Done sempre abilitato

Tuttavia, quando si tocca la barra di ricerca, il pulsante Fine viene inizialmente disabilitato. Ciò si verifica fino a quando non si immette qualsiasi carattere.

Quello che voglio fare è che il pulsante Fine sia sempre abilitato, in modo tale che se lo tocco, posso chiudere immediatamente la tastiera.

Qualsiasi aiuto? sarebbe molto apprezzato

che ho sul mio UIViewController

-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar 
{ 
    return YES; 
} 

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    [searchBar resignFirstResponder]; 
} 

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if (searchBar.text.length == 0) 
    { 
     //[self fixOrientation]; 
     [searchBar resignFirstResponder]; 
    } 
    else 
    { 
     NSLog(@"typed"); 
    } 
} 


-(void)searchBarTextDidBeginEditing:(UISearchBar *)theSearchBar 
{ 
    NSLog(@"began"); // this executes as soon as i tap on the searchbar, so I'm guessing this is the place to put whatever solution is available 
} 

risposta

17

Oggi UISearchBar conforme alle UITextInputTraits. Si può semplicemente impostare:

searchBar.enablesReturnKeyAutomatically = NO; 

ATTENZIONE: Anche se questo viene compilato per iOS 7.0, sarà incidente in fase di esecuzione. Funziona solo per> = 7.1.

I documenti non sono chiari su questo, poiché solo dal 7.1 lo implementa il protocollo UITextInputTraits, ma non viene rilevato da quale versione di iOS viene adottato il protocollo.

+0

bello e semplice! Stavo tornando a questa vecchia domanda dato che sto spostando alcune app oooooold a 64 bit e ho dimenticato la soluzione per un caso d'uso specifico –

0

Sulla base l'applicazione Maps, ad esempio, sembra che il modello dovrebbe essere quello di avere un pulsante Annulla nei pressi del campo di testo per sbarazzarsi della tastiera. Detto questo, un suggerimento potrebbe essere quello di avere un numero personalizzato UIButton posizionato proprio in quell'angolo che assomiglia al pulsante Fatto.

Una specie di soluzione di hacky ...

Spero che questo aiuti!

+0

mmmmmjm, non convinto su quello (mettendo un pulsante sulla parte superiore di quell'angolo). Credo di aver visto una volta sul web come è stato fatto, ma non sono riuscito a trovarlo di nuovo –

+1

@AndyDunn, maaaan, dopo un po 'di tempo ho capito che la tua soluzione è quella giusta! Mi scuso per non averlo provato quando hai postato. Scusa grande tempo. Apprezzo sempre il tempo che altri danno ad aiutare gli altri qui –

+0

Sì, è un pattern che si adatta alla ricerca di tipo 'UISearchDisplayController'. Controlla iBooks, non c'è nessun pulsante _Cancel_ lì. –

30

È possibile aggirare il problema aggirando le sottoview in UISearchBar fino a trovare il campo di testo. È quindi solo questione di impostare "enableReturnKeyAutomatically" su NO. Tra l'altro il seguente codice è utile anche per impostare il tipo di tastiera.

// loop around subviews of UISearchBar 
    for (UIView *searchBarSubview in [searchBar subviews]) {  
    if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)]) {  
     @try { 
     // set style of keyboard 
     [(UITextField *)searchBarSubview setKeyboardAppearance:UIKeyboardAppearanceAlert]; 

     // always force return key to be enabled 
     [(UITextField *)searchBarSubview setEnablesReturnKeyAutomatically:NO]; 
     } 
     @catch (NSException * e) {   
     // ignore exception 
     } 
    } 
    } 
+2

è davvero così difficile per questa semplice e stupida cosa? –

+0

L'ultima volta che ho controllato, sì, purtroppo lo è. – AndyDunn

+0

Il try/catch è davvero necessario? –

0

Un modo semplice e delicato è appena messo un vuoto quando si inizia la modifica di ricerca

-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{ 
    //Add a blank character to hack search button enable 
    searchBar.text = @" ";} 
10

La risposta accettata non sembra funzionare più, così ho fatto la mia categoria che non sembra funzionare :

@implementation UISearchBar (enabler) 

- (void) alwaysEnableSearch { 
    // loop around subviews of UISearchBar 
    NSMutableSet *viewsToCheck = [NSMutableSet setWithArray:[self subviews]]; 
    while ([viewsToCheck count] > 0) { 
     UIView *searchBarSubview = [viewsToCheck anyObject]; 
     [viewsToCheck addObjectsFromArray:searchBarSubview.subviews]; 
     [viewsToCheck removeObject:searchBarSubview]; 
     if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)]) { 
      @try { 
       // always force return key to be enabled 
       [(UITextField *)searchBarSubview setEnablesReturnKeyAutomatically:NO]; 
      } 
      @catch (NSException * e) { 
       // ignore exception 
      } 
     } 
    } 
} 
+1

Fantastic. Grazie – TheMan

+2

anche questo funziona (almeno su iOS 9. non sono sicuro dell'altro): if ([self.searchBar rispondeSoSelector: NSSelectorFromString (@ "searchField")]) { UITextField * searchTextField = ((UITextField *) [ self.searchBar valueForKey: @ "searchField"]); searchTextField.enablesReturnKeyAutomatically = NO; } – codrut

2

si prega di scrivere codice seguente può essere utile per voi :)

Questo codice d Pulsante di ricerca isplay se hai una stringa vuota.

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar 
{ 
    [itemSearchBar setShowsCancelButton:YES]; 
    UITextField *searchBarTextField = nil; 
    for (UIView *subView in self.itemSearchBar.subviews) 
    { 
     for (UIView *sndSubView in subView.subviews) 
     { 
      if ([sndSubView isKindOfClass:[UITextField class]]) 
      { 
       searchBarTextField = (UITextField *)sndSubView; 
       break; 
      } 
     } 
    } 
    searchBarTextField.enablesReturnKeyAutomatically = NO; 
    return YES; 
} 
+0

È più probabile che si interrompa di nuovo se la gerarchia della vista cambia. Consiglia di utilizzare uno stile come la risposta di Gujamin o una funzione ricorsiva. – eselk

4

Per iOS 8 e, soprattutto, è possibile utilizzare

[self.searchBar setReturnKeyType:UIReturnKeyDone]; 
[self.searchBar setEnablesReturnKeyAutomatically:NO]; 
+1

funziona perfettamente per me, ho appena dimesso la tastiera quando l'utente fa clic sul pulsante Fine. Quindi, funziona bene per me –

0

prolunga per Swift:

extension UISearchBar { 
    var textField: UITextField? { 
     return getTextField(inViews: subviews) 
    } 

    private func getTextField(inViews views: [UIView]?) -> UITextField? { 
     guard let views = views else { return nil } 

     for view in views { 
      if let textField = (view as? UITextField) ?? getTextField(inViews: view.subviews) { 
       return textField 
      } 
     } 

     return nil 
    } 
} 

Usage:

searchBar.textField?.returnKeyType = .Done 
searchBar.textField?.enablesReturnKeyAutomatically = false 
0

soluzione semplice e facile per iOS 10 su XCode 8.3. 3, anche se ci è voluto del tempo per capirlo :)

@IBOutlet var searchBar: UISearchBar! { 
    didSet { 
     searchBar.returnKeyType = .done 
     searchBar.enablesReturnKeyAutomatically = false 
    } 
} 

Cambia ricerca in Chiudi. Abilita Fatto senza dover digitare nulla nel campo di ricerca. Dopo di che -> searchBar.resignFirstResponder() in questo modo:

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 
    searchBar.resignFirstResponder() 
} 
+0

grazie! 7 anni di ritardo ma grazie;) –

+0

:) Alla fine lo hai scoperto? :) Ci sarà sempre qualcuno che può farne uso. Felice di aiutare, evviva! –

Problemi correlati