7

Sto lavorando a un'applicazione di tabulazioni e una delle schede ha un UISearchDisplayController collegato a una UISearchBar. È tutto collegato alla NIB e sta funzionando. Quando toccherò la barra di ricerca, i pulsanti Scope e Cancel volano in ecc, e il delegato della ricerca aggiorna correttamente la tabella dei risultati.UISearchDisplayController non funziona quando viene creato nel codice?

Comunque, sto cercando di attuare lo stesso codice in viewDidLoad messaggio invece del pennino, tuttavia quando elimino il controller display di ricerca dalla NIB e rimuovere il mio codice per creare lo stesso controller nella funzione, esso doesn lavorare È come se non fosse stata stabilita una connessione fondamentale in modo che non venga chiamata tutta la mia funzionalità di delega di ricerca.

Ecco il mio funzionante Versione NIB del controller di visualizzazione di ricerca. È collegato alla barra di ricerca, la sottoclasse UINavigationController (MASearchController) e la vista radice di tale rete è collegata come searchContentsController.

alt text http://img192.imageshack.us/img192/3050/screenshot20100307at304.png

Ora, questo è ciò che ci si aspetta di fare in codice per creare lo stesso, giusto? Quello che sto facendo è lasciare UISearchBar nella NIB per eliminare un pezzo del puzzle alla volta nel codice.

// [MASearchController viewDidLoad] 
UISearchDisplayController *searchController = [[[UISearchDisplayController alloc] 
    initWithSearchBar:searchBar 
    contentsController:[[self viewControllers] objectAtIndex:0]] autorelease]; 
[searchController setDelegate:self]; 
[searchController setSearchResultsDelegate:self]; 
[searchController setSearchResultsDataSource:self]; 

Ho controllato tutti gli oggetti in fase di esecuzione e si sono verificati tutti. Essenzialmente ho cancellato il controller del display di ricerca dalla NIB e poi ho inserito il codice per crearlo nel messaggio viewDidLoad.

Perché questo non funziona? Viene visualizzata la tastiera di ricerca ma nessuna delle funzioni di ricerca e animazione dei pulsanti funziona ???

risposta

9

Wow, ho appena capito il problema.

ho pensato, perché la proprietà searchDisplayController per l'UIViewController si trova all'interno del initWithSearchBar: contentsController: messaggio che sarebbe ancora autorelease la mia copia del puntatore, ma quando ho rimosso la autorelease la cosa stupida iniziato a lavorare. Gaaaah. Perché non conserverebbe la propria copia (UIViewController)?

+0

Stavo correndo lo stesso problema. Grazie per aver postato questo! – DOOManiac

3

Solitamente gli oggetti figlio non devono conservare il genitore. In questo caso è il controllore genitore che dovrebbe mantenere il bambino (che è il controller di visualizzazione della ricerca).

Questo è stato fatto automaticamente quando si crea l'SDC in file NIB perché è stato aggiunto alla proprietà searchDisplayController del controller di visualizzazione e quindi conservato per la durata del controller della vista.

Tuttavia, poiché l'impostazione della proprietà searchDisplayController su un controller di visualizzazione è considered usage of private api. Dovresti semplicemente aggiungere un ivar per trattenerlo e rilasciarlo manualmente su dealloc.

la semplice eliminazione dei chiamata autorelease è una perdita di memoria, come si sta lasciando attorno ad un oggetto che si init -ED senza salvare un riferimento ad esso in modo da non penso che sia la risposta corretta.

Invece si dovrebbe mantenere il searchController correttamente in un Ivar e rilasciarlo su correttamente su dealloc come si farebbe con qualsiasi oggetto che si desidera rimanere in vita per tutta la durata del controller della vista.