2012-07-15 10 views
5

Zaimplementowałem pasek wyszukiwania i indeks dla mojego widoku tabeli. Pracuje dobrze. Zauważyłem jednak, że po kliknięciu paska wyszukiwania indeks jest nadal dostępny, a kliknięcie go powoduje nieprzewidywalne wyniki. Zamiast debugowania tego, myślałem, że będzie łatwiej ukryć indeks :)Ukryj pasek indeksu podczas wyszukiwania UITableView

Znalazłem odniesienia w innym miejscu, dzwoniąc pod numer sectionIndexTitlesForSectionView i wracając do zera. Tak więc, gdy kliknę w polu wyszukiwania, w searchBarTextDidBeginEditing nawiązywałem jednoznaczne połączenie z [self sectionIndexTitlesForSectionView:[self tableView]].

Powoduje to, że sectionIndexTitlesForSectionView nie jest wywoływany i zwraca zero, ale indeks jest nadal obecny.

Wszelkie pomysły/sugestie będą bardzo mile widziane! Tony.

+0

Wszelkie uwagi, proszę? – Tony

+0

Wciąż mam nadzieję, że ktoś mi w tym pomoże. Dzięki. – Tony

Odpowiedz

0

Wystarczy mieć metoda (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView powrócić nil podczas wyświetlania wyników wyszukiwania.

W moim przypadku wygląda to mniej więcej tak:

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

Dzięki za sugestię, Marcel. Może nie byłem wystarczająco jasny - ja też wracam zero - W debugerze potwierdziłem, że zero jest zwracane z tej funkcji - jednak indeks jest nadal wyświetlany. – Tony

+0

Wtedy myślę, że nie rozumiem dobrze problemu. Prawdopodobnie najlepiej, jeśli napiszesz jakiś kod. –

+0

Oto kod: '- (NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView { // jeśli szukają, nie ma potrzeby, aby wyświetlić indeks if (isSearchOn) powrót nil; inny { // upewnić wskaźników nie nakładają pole wejściowe pasek wyszukiwania [(ID) searchBar setContentInset: UIEdgeInsetsMake (5, 0, 5, 35)]; return englishIndex; } } ' – Tony

23

trzeba wrócić nil w - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView Jeśli wyszukiwanie jest aktywny, jak można zauważyć w swoim poście. Następnie zastąp dwie metody z UISearchDisplayDelegate, aby odświeżyć indeksy.

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

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

Dla metody sectionIndexTitlesForTableView, wolę używać:

- (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", @"#"]; 
    } 
} 

UWAGA: Uważam, że trzeba użyć self.searchDisplayController.active w razie choroby. To nie działa, jeśli używasz tableView != self.tableView.

0

Oto prosty sposób, jeśli nie chcesz przekazywać nic w sekcjiIndexTitlesForTableView, Jeśli musisz zrobić tylko jeden indeks dla tekstu wyszukiwania i chcesz pokazać tekst wyszukiwania jako tytuł nagłówka sekcji.

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; 
}