5

Dodałem UISearchDisplayController do mojego UITableViewController w InterfaceBuilder. Bardzo łatwo było go uruchomić, dodając metodę searchBar: searchBar textDidChange: searchText, która regeneruje tablicę danych dla tabeli i wywołuje reloadData.Jak wstępnie załadować lub zainicjować wyszukiwanie przy użyciu UISearchDisplayController?

Ale chciałbym, aby poprzednie wyszukiwanie było wyświetlane następnym razem, gdy użytkownicy dotkną paska wyszukiwania, ponieważ znacznie łatwiej jest dotknąć przycisku (X) i wyczyścić go, niż wpisywać ponownie. Ale nie mogę tego zrobić. Poniżej znajduje się kod Próbowałem:

- (void) searchBar: (UISearchBar *) searchBar textDidChange: (NSString *) searchText { 
    if(searchText && [searchText length] > 0) { 
     self.displayedRows = [[NSMutableArray initWithCapacity: 1]; 
     for(NSString *l in self.allRows) { 
      NSRange r = [l rangeOfString: searchText]; 
      if(r.location != NSNotFound) 
       [self.displayedRows addObject: l]; 
     } 
     [self.searchDisplayController.searchResultsTableView reloadData]; 
    } 
} 

- (void) searchDisplayControllerWillBeginSearch: (UISearchDisplayController *) controller { 
    if(self.lastSearch && [self.lastSearch length] > 0) { 
     controller.searchBar.text = self.lastSearch; 
     [controller.searchResultsTableView reloadData]; 
    } 
} 

- (void) searchDisplayControllerWillEndSearch: (UISearchDisplayController *) controller { 
    self.lastSearch = controller.searchBar.text; 
    self.displayedRows = self.allRows; 
    [self.tableView reloadData]; 
} 

Wyszukiwanie ostatni tekst jest odpowiednio w pasek wyszukiwania następnym razem dotknąć szukanie i byłem zaskoczony, że „kursor” jest jeszcze umieszczony na końcu, ale wyniki wyszukiwania nie są wyświetlane, tylko przyciemniony widok oryginalnych treści, takich jak pole wyszukiwania, był pusty. Po wpisaniu znaku wyniki wyszukiwania są aktualizowane.

Próbowałem oddanie równowartość [self.searchDisplayController.searchResultsTableView reloadData] do każdego z:

searchDisplayControllerDidBeginSearch: (UISearchDisplayController *) controller 
searchDisplayController: (UISearchDisplayController *) controller didLoadSearchResultsTableView: (UITableView *) tableView 
searchDisplayController: (UISearchDisplayController *) controller willShowSearchResultsTableView: (UITableView *) tableView 
searchDisplayController: (UISearchDisplayController *) controller didShowSearchResultsTableView: (UITableView *) tableView 

Ale to nie miało znaczenia ... po prostu pusta, dopóki nie wpisać coś.

Czy ktoś ma pomysły, jak uzyskać wstępnie załadowany wynik wyszukiwania?

Odpowiedz

7

Trzeba coś takiego:

- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller { 
    if(lastSearch.length > 0) { 
     NSLog(@"In searchDisplayControllerDidBeginSearch"); 
     [self.searchDisplayController.searchBar setText:lastSearch]; 
    } 
} 

Jeśli chcesz dokonać dalszych zmian, proponuję otwierając UIKit nagłówki UISearchBar.h i UISearchDisplayController.h i patrząc na to, co można przeciążać i gdzie. Również NSLog jest twoim przyjacielem =)

również

Wystarczy, aby wyjaśnić, co się dzieje i jak to różni się od ...searchBar.text = lastSearch, setText siły textDidChange się zarejestrować, co z kolei Ponawia wyszukiwanie, a następnie został połączenie z shouldReloadTableForSearchString. Po prostu zmiana tekstu bez użycia setText (z jakiegoś powodu) nie wyzwala textDidChange.

+0

Zdumiewające, myślałem, że wypróbowałem każdą możliwą kombinację wszystkich różnych woluminów i didBegins, ale poruszałem tylko część 'reloadData', ponieważ poprzedni test był zawsze w polu wyszukiwania. – LavaSlider

+0

Próbowałem, jak zasugerowałeś przeniesienie 'controller.searchBar.text = self.lastSearch' i presto, działa (który trochę ciemny flash, który byłoby miło nie mieć). Wydaje mi się nawet, że nie potrzebuję 'reloadData'. Dzięki. – LavaSlider

+0

(Aha, i miałem tak wiele 'NSLogs' .Miałem je, kiedy wchodziłem i wychodziłem z metod i pokazując zawartość pola i rozmiary tablic ... to po prostu nie aktualizuje). – LavaSlider

Powiązane problemy