2015-02-10 8 views
49

Questo deve essere banale, ma non riesco a trovare il modo in cui si suppone di ignorare un UISearchController a livello di codice?Come si elimina un UISearchController? (iOS 8 e successivi)

Nota che è il nuovo UISearchController (introdotto nel 2014 con iOS 8), non UISearchDisplayController.

Finora qui è quello che ho ottenuto

// Dismiss the search tableview 
searchController.dismissViewControllerAnimated() 
// Clear the Search bar text 
searchController.active = false 

Ma ho ancora il pulsante Annulla e non riesco a sbarazzarsi di esso.

risposta

114

OK quindi dopo ulteriori test, risulta devi solo impostare:

searchController.active = false 
// or swift 4+ 
searchController.isActive = false 

Questa è la prima cosa che ho provato ma ho chiamato in uno dei metodi UISearchControllerDelegate che non ha funzionato (probabilmente dovrebbe l'ho chiamato con dispatch_async (la risposta di halbano sembra confermarlo)).

In ogni caso, dato che non riesco a trovare la risposta online, sto rispondendo alla mia domanda, spero che possa aiutare qualcuno.

+1

Questo funziona davvero! Idk come la semplice modifica di una variabile attiva effettivamente il ridisegno dell'interfaccia utente ma funziona – Bhargav

+1

@Bhargav Molto probabilmente perché c'è qualche KVO (Key Value Observing) in corso – Nycen

+1

Plus chiama il metodo 'UISearchControllerDelegate'' didDismissSearchController (searchController) '. –

15

Si è verificato questo problema quando si tenta di chiudere il controller di ricerca dopo aver eseguito il passaggio a un'altra vista? Ho riscontrato anche questo problema. Penso che si potrebbe desiderare di utilizzare

self.definesPresentationContext = true 

nel controller della vista che presenta l'UISearchController secondo questo post UISearchController not dismissed when View is pushed. Per me funziona.

9

Stavo presentando la mina incorporata in una barra di navigazione. Il codice che funziona per me era:

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.searchController setActive:NO]; 
     self.navigationController.navigationBar.topItem.title = @"MYTITLE".uppercaseString; 
     self.navigationItem.titleView = nil; 
    }); 
} 

Spero che aiuti qualcuno.

+3

non era il codice esatto, ma l'invio async mi ha indirizzato nella giusta direzione! – kennydust

+0

Buono! Anche ottenere il thread principale per gestire gli elementi dell'interfaccia utente è obbligatorio, forse questa è stata la magia. – halbano

0

Ho avuto questo problema utilizzando la ricerca e interactionController, risolto dopo appena includono la riga: self.dismissViewControllerAnimated (false, il completamento: zero)

Aprire l'interazione e cancellare la ricerca senza cambiamenti del delegato.

+0

Il problema è che questo non attiverà alcune funzioni delegate come 'willDismissSearchController' che potrebbero essere necessarie. – aasatt

0

SWIFT 4+

searchController.isActive = false 
Problemi correlati