2012-07-15 16 views
5

Ho implementato una barra di ricerca e funzionalità di indice per la mia vista tabella. Lavorare bene. Tuttavia, ho notato che quando faccio clic sulla barra di ricerca, l'indice è ancora disponibile e facendo clic su di esso si ottengono risultati imprevedibili. Piuttosto che eseguire il debug, ho pensato che sarebbe stato più semplice nascondere l'indice :)Nascondi barra dell'indice durante la ricerca di UITableView

Ho trovato riferimenti altrove per chiamare sectionIndexTitlesForSectionView e restituire nil. Quindi, quando faccio clic nella casella di ricerca, in searchBarTextDidBeginEditing ho effettuato una chiamata esplicita a [self sectionIndexTitlesForSectionView:[self tableView]].

Il risultato è che sectionIndexTitlesForSectionView viene richiamato e restituito nullo, ma l'indice è ancora presente.

Qualsiasi idea/suggerimento sarebbe molto apprezzato! Tony.

+0

Eventuali commenti, per favore? – Tony

+0

Spero ancora che qualcuno possa aiutarmi con questo. Grazie. – Tony

risposta

0

È sufficiente il metodo (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView restituire nil quando si visualizzano i risultati della ricerca.

Nel mio caso, questo sembra qualcosa di simile:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 
    if (tableView == [self tableView]) { 
     return [[NSArray arrayWithObject:UITableViewIndexSearch] arrayByAddingObjectsFromArray:[collation sectionIndexTitles]]; 
    } 
    // search view, no index: 
    else return nil; 
} 
+0

Grazie per il suggerimento, Marcel. Forse non ero abbastanza chiaro - anch'io ritorno nil - Ho confermato nel debugger che nil viene restituito da questa funzione - tuttavia, l'indice è ancora visualizzato. – Tony

+0

Quindi penso di non capire bene il problema. Probabilmente è meglio se pubblichi del codice. –

+0

Ecco il codice: '- (NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView { // se la ricerca, non c'è bisogno di visualizzare l'indice se (isSearchOn) nil di ritorno; else { // assicurarsi che l'indice non si sovrapponga al campo di immissione della barra di ricerca [(id) searchBar setContentInset: UIEdgeInsetsMake (5, 0, 5, 35)]; return englishIndex; } } ' – Tony

23

Dovete restituire nil in - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView se la ricerca è attiva, come si nota nel tuo post. Quindi, eseguire l'override di due metodi da UISearchDisplayDelegate per aggiornare gli indici.

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller { 
    [self.tableView reloadSectionIndexTitles]; 
} 

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller { 
    [self.tableView reloadSectionIndexTitles]; 
} 

Per il metodo sectionIndexTitlesForTableView, io preferisco usare:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 
    if (self.searchDisplayController.active) { 
     return nil; 
    } else { 
     //Add @"{search}", to beginning to add search icon to top of index 
     return @[@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"U", @"V", @"W", @"X", @"Y", @"Z", @"#"]; 
    } 
} 

NOTA: ho scoperto che è necessario utilizzare self.searchDisplayController.active in se la condizione. Non funziona se usi tableView != self.tableView.

0

Ecco il modo semplice, se non si desidera passare nil nella sezioneIndexTitlesForTableView, se si deve fare solo un indice per il testo di ricerca e si desidera mostrare il testo di ricerca come titolo dell'intestazione della sezione.

NSArray *subViewsOfTblView = [self.tableView subviews]; 
if([subViewsOfTblView count] > 0) 
{ 
    UIView *indexVw = (UIView*)subViewsOfTblView[[subViewsOfTblView count] - 1]; 
    if(isSearchON || isFilterON) 
     indexVw.hidden = YES; 
    else 
     indexVw.hidden = NO; 
} 
Problemi correlati