27

Ho un UISearchDisplayController e UISearchBar collegato al mio ViewController tramite Outlets dal mio pennino.Nascondi UISearchBar Pulsante Annulla

Vorrei nascondere il pulsante Annulla in modo che l'utente non lo veda mai. Il problema è che il codice seguente nasconde il pulsante, ma solo dopo averlo visualizzato all'utente per un millisecondo (ad esempio, lampeggia sul simulatore e sul dispositivo e quindi scompare alla vista).

- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller 
{ 
    controller.searchBar.showsCancelButton = NO; 
} 

C'è un modo migliore per nasconderlo?

risposta

36

sono riuscito a nascondere il pulsante "Annulla" di sottoclassi UISearchBar e ignorare questo metodo:

-(void)layoutSubviews{ 
    [super layoutSubviews]; 
    [self setShowsCancelButton:NO animated:NO]; 
} 
+1

Funziona! Creo un controller di visualizzazione con le funzioni di ricerca e poi metto l'intero controller di visualizzazione all'interno di un popover per iPad. Ovviamente, il pulsante "Annulla" non è necessario per il popover dell'iPad, quindi sto cercando una soluzione per il pulsante non-cancle, e questo funziona! –

+2

Funziona alla grande! Penso di aver provato in ogni altro modo descritto per risolvere questo problema per evitare la sottoclasse, ma non è stato in grado di farlo! Ma questo ha risolto perfettamente! Grazie! – kentrh

+0

Questo non ha funzionato per me, ho usato il modo di notifica di BFeher – paulvs

0

Proprio sulla base di problemi che ho avuto prima hai provato mettendolo in:

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller 

Non so come porre questa domanda nella tua domanda dispiace se questo è fuori luogo.

+0

Sì, L'ho provato prima di postare qui. Non funziona: \ – ArtSabintsev

+0

quindi è necessario configurare il pulsante Annulla quando si crea UISearchDisplayController, non attendere fino a quando non ha iniziato una ricerca. – jamesC

+0

Ho provato anche quello. Non ha funzionato – ArtSabintsev

6

Questo sembra essere un bug all'interno di Xcode. Ho inviato questo errore al sito di segnalazione dei bug di Apple, e hanno seguito il problema chiedendo altro codice di esempio e casi d'uso.

Grazie a tutti per il vostro tentativo di risolvere questo problema.

+2

Ho lo stesso problema, ma al contrario. Ho provato a creare UISearchDisplayController e UISearchBar utilizzando un file pennino e in modo programmatico, ma invece di nascondere il pulsante Annulla, ho bisogno che venga mostrato tutto il tempo. Nel controller, ho la vista di impostare il pulsante per essere visibile, così come in alcuni dei metodi delegati, ma quando annullo la ricerca, il pulsante scompare, quindi riappare. Spero che questo venga risolto presto. –

+2

Hanno risposto dicendo che si tratta di un problema noto e stanno cercando di risolverlo. – ArtSabintsev

+0

Sono contento che ne siano a conoscenza, rende la mia barra di ricerca un po 'schifosa. È necessario utilizzare un pulsante personalizzato nel frattempo. –

8

Simile alla risposta di Nimrod, è anche possibile creare una sottoclasse UISearchDisplayController e implementare il metodo setActive:animated::

- (void)setActive:(BOOL)visible animated:(BOOL)animated { 
    [super setActive:visible animated:animated]; 
    self.searchBar.showsCancelButton = NO; 
} 
15

Ho avuto lo stesso problema, ma l'ho risolto in un modo diverso.

Per coloro che non possono o non vogliono sottoclasse UISearchDisplayController, ho risolto il problema aggiungendo un listener su UIKeyboardWillShowNotification e impostando [self setShowsCancelButton:NO animated:NO] lì.

In viewWillAppear::

// Add keyboard observer: 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWillAppear:) 
              name:UIKeyboardWillShowNotification 
              object:nil]; 

quindi si crea:

- (void)keyboardWillAppear:(NSNotification *)notification 
{ 
    [YOUR-SEARCHBAR-HERE setShowsCancelButton:NO animated:NO]; 
} 

Non dimenticare di aggiungere,

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

in viewWillDisappear:!

Spero che questo aiuti!

+0

Non funziona perfettamente se la tastiera è già aperta prima di toccare. –

+0

Incredibile grazie, esattamente quello che stavo cercando. – GameDev

0

Se il pulsante Annulla viene visualizzato quando si modifica il campo di ricerca della barra di ricerca, è possibile eseguire quanto segue; sottoclasse la barra di ricerca e farlo implementare il protocollo UITextFieldDelegate:

@interface CustomAlignedSearchBar : UISearchBar<UITextFieldDelegate> 

quindi implementare textFieldDidBeginEditing: e fare qualcosa di simile:

- (void)textFieldDidBeginEditing:(UITextField *)textField{ 
    [self setShowsCancelButton:self.cancelButtonShown animated:NO]; 
} 

Questo farà in modo che il pulsante Annulla non verranno visualizzati.

+0

'MLUISearchBar.m: 25: 37: Proprietà 'cancelButtonShown' non trovata sull'oggetto di tipo 'MLUISearchBar *'' errore di compilazione – Gank

2
class CustomSearchBar: UISearchBar { 

    override func setShowsCancelButton(showsCancelButton: Bool, animated: Bool) { 
     super.setShowsCancelButton(false, animated: false) 
    } 

} 

class CustomSearchController: UISearchController, UISearchBarDelegate { 

    lazy var _searchBar: CustomSearchBar = { 
     [unowned self] in 
     let customSearchBar = CustomSearchBar(frame: CGRectZero) 
     customSearchBar.delegate = self 
     return customSearchBar 
    }() 

    override var searchBar: UISearchBar { 
     get { 
      return _searchBar 
     } 
    } 

} 
+0

Funziona alla grande. Ma non capisco la necessità di impostare il delegato della barra di ricerca. –

2

Se si vuole evitare la creazione di sottoclassi, implementare

searchController.searchBar.showsCancelButton = false; 

in questi due metodi delegato (Non dimenticare di assegnare i delegati):

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController 

- (void)didPresentSearchController:(UISearchController *)searchController 

Il il primo viene chiamato ogni volta che si aggiorna la barra di ricerca (il pulsante Annulla è visibile per impostazione predefinita) e il secondo è per la prima attivazione di SearchBar.

+0

Purtroppo non è possibile farlo funzionare. – lostintranslation

+0

perfetto! non volevo sottoclasse! – SergioM

2

Aveva questo problema quando si utilizzava UISearchBar con UISearchController. Sto usando il mio pulsante di annullamento, come il pulsante di annullamento wasn't showing on iPad con showsCancelButton = YES, ora non verrà nascosto su iPhone con showsCancelButton = NO!

Quanto segue ha funzionato per me.

Imposta il delegato, e il valore iniziale:

- (void)viewDidLoad 
{ 
    // ... 
    self.searchController.searchBar.showsCancelButton = NO; 
    self.searchController.searchBar.delegate = self; 
} 

Ripristina showsCancelButton-NO 0.1s dopo la barra di testo inizia la modifica.

#pragma mark - UISearchBarDelegate 
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 
{ 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
     self.searchController.searchBar.showsCancelButton = NO; 
    }); 
} 
+0

Grazie per la risposta. Ha funzionato per me per nascondere il pulsante Annulla. – Ramakrishna

0

Dopo UISearchDisplayController deprecato in iOS 8, Apple dare presentazione ricerca maniglia per UISearchControllerDelegate.

in modo da poter eseguire l'override di ricerca permette di nascondere il pulsante Annulla, come di seguito:

- (void)didPresentSearchController:(UISearchController *)searchController { 
    [searchController.searchBar setShowsCancelButton:NO]; 
} 

se avete bisogno di nascosto pulsante Annulla da stato inattivo, è necessario Searchbar impostato sul init:

search = [[UISearchController alloc] initWithSearchResultsController:nil]; 
[search.searchBar setShowsCancelButton:NO]; 
Problemi correlati