2010-06-02 2 views
9

Sto cercando di ricreare questo UISearchBar (come si vede nella tabella di ricerca codice di esempio):Grey UISearchBar w/corrispondenza bar ambito di programmazione

alt text http://img168.imageshack.us/img168/6378/43558113.png

Tutti gli esempi che ho visto fare questo coinvolgere usando uno xib, tuttavia ho bisogno di farlo a livello di programmazione. Il problema sta cambiando il colore della tinta cambia anche la tinta del pulsante di annullamento:

alt text http://img243.imageshack.us/img243/1375/screenshot20100527at944.png

Tutte le idee?

risposta

17

Associare la barra di ricerca con un UISearchDisplayController fornisce magicamente un sacco di aspetto normale e il comportamento come ad esempio:

  • grigio tinta senza influire pulsante di annullamento
  • auto visualizzare/nascondere del pulsante di annullamento
  • regolazione della larghezza intorno gli indici Tableview

Nel mio controller Tableview che ho fatto la seguente:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // setup searchBar and searchDisplayController 

    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero]; 
    [searchBar sizeToFit]; 
    searchBar.delegate = self; 
    searchBar.placeholder = @"Search"; 
    self.tableView.tableHeaderView = searchBar; 

    UISearchDisplayController *searchDC = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self]; 

    // The above assigns self.searchDisplayController, but without retaining. 
    // Force the read-only property to be set and retained. 
    [self performSelector:@selector(setSearchDisplayController:) withObject:searchDC]; 

    searchDC.delegate = self; 
    searchDC.searchResultsDataSource = self; 
    searchDC.searchResultsDelegate = self; 

    [searchBar release]; 
    [searchDC release]; 
} 
+0

Controllare anche la risposta di Joris Kluivers sulla sovrascrittura searchDisplayController – JOM

+2

Nel caso in cui qualcuno stia pensando di utilizzarlo, la mia app è stata appena respinta per l'utilizzo di API non pubbliche. setSearchDisplayController era il colpevole. – Rob

+0

Obsoleto per iOS 7 .. –

16

Sono totalmente d'accordo con Scott McCammon.

Tuttavia l'utilizzo di performSelector:withObject: su setSearchDisplayController: non sarebbe il mio approccio. Questo dipende dall'API privata che può cambiare in qualsiasi momento. Se Apple rimuoverà la loro implementazione privata, la tua app andrà in crash.

Un modo migliore sarebbe quello di ignorare il searchDisplayController: nel controller scopo di restituire l'istanza di UISearchDisplayController:


- (UISearchDisplayControlelr *) searchDisplayController { 
    return yourInstanceOfASearchController; 
} 
1

Non capisco la necessità per la chiamata al setSearchDisplayController: o l'override per searchDisplayController. In iOS 4.3.2 initWithSearchBar:contentsController: sembra impostare searchDisplayController per l'istanza UIViewController passata come argomento contentsController. Forse questo era un problema nelle versioni precedenti di iOS, ma appare ridondante nella versione corrente.

+2

Ho eseguito altri test. searchDisplayController viene assegnato, ma non viene mantenuto come notato da Scott McCammon sopra. Anziché richiamare l'API non documentata, sto salvando un riferimento mantenuto in una variabile di istanza e quindi lo rilascio in dealloc. – rich

+0

Idem per me. Io uso 3 variabili di istanza private sul file .m: UISearchBar * searchBar; NSArray * filteredList; UISearchDisplayController * searchController ;. Sotto ARC, non credo che sia necessario annullarli in un 'dealloc', ma non sono esperto. Quando combini iOS 4 e ARC, non hai bisogno di riferimenti deboli, ma i riferimenti regolari (forti) vengono automaticamente annullati. –

+0

è apparentemente consigliabile utilizzare le proprietà per oggetti come UISearchDisplayController e tanto meno la maggior parte degli oggetti in generale. In effetti, non sono riuscito a far funzionare la mia SDC a meno che non avessi dichiarato una proprietà. Quindi ho usato il codice di Scott McCammon e invece di dichiarare localmente la SDC ne ho fatto una proprietà privata. – mafiOSo