Ich fand eine viel bessere Lösung für dieses Problem, und es scheint perfekt auf iOS 6 und 7 zu funktionieren. Während es immer noch ein Hack ist, ist es ein viel sauberer und zukunftssicherer Hack als die oben genannten. Die anderen Lösungen funktionieren nicht konsistent und verhindern, dass einige UISearchDisplayDelegate-Methoden jemals ausgelöst werden! Außerdem hatte ich komplexe Einfügeprobleme, die ich mit den oben genannten Methoden nicht lösen konnte. Das Hauptproblem bei den anderen Lösungen besteht darin, dass sie die Interna des UISearchDisplayControllers ernsthaft durcheinander bringen.Meine Lösung basiert auf der Beobachtung, dass UISearchDisplayContoller ein UISearchbarDelegate ist und dass die automatische Anzeige der Ergebnistabelle & durch Simulieren eines Tastendrucks im Suchfeld ausgelöst werden kann! Also:
- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller
{
if ([controller respondsToSelector: @selector(searchBar:textDidChange:)])
[(id<UISearchBarDelegate>)controller searchBar: controller.searchBar textDidChange: @" "];
}
Dieser Code ist zukunftssicher gegen Absturz durch Überprüfung an die UISearchbarDelegate Methode reagiert und sendet Raum @“", um die UISearchDisplayController zu verleiten Benutzer denken einen Brief getippt hat.
Nun, wenn der Benutzer etwas eingibt und dann löscht, wird die Tabelle wieder abgedunkelt. Die anderen Lösungen versuchen, dies zu umgehen, indem sie etwas in der searchDisplayController: didHideSearchResultsTableView: -Methode tun. Aber das ergibt für mich keinen Sinn, denn wenn Sie die Suche abbrechen, muss Ihre Ergebnistabelle wirklich ausgeblendet werden. In diesem Fall müssen Sie möglicherweise Code ausführen. Meine Lösung für diesen Teil ist (beachten Sie wahrscheinlich eine Methode umgestellt Kategorie nutzen könnte, um es überall funktioniert, wenn in Ihrem Projekt erforderlich) Unterklasse:
// privately declare protocol to suppress compiler warning
@interface UISearchDisplayController (Super) <UISearchBarDelegate>
@end
// subclass to change behavior
@interface GMSearchDisplayController : UISearchDisplayController
@end
@implementation GMSearchDisplayController
- (void) searchBar: (UISearchBar *) searchBar textDidChange: (NSString *) searchString
{
if (searchString.length == 0)
searchString = @" ";
if ([super respondsToSelector: @selector(searchBar:textDidChange:)])
[super searchBar: searchBar textDidChange: searchString];
}
@end
Dieser Code funktioniert, indem die textDidChange Delegatmethode Abfangen und Ändern von null oder leere Strings in die Space-Zeichenfolge @ "" verhindern das normale Ausblenden/Dimmen, das in einer leeren Suchleiste auftritt. Wenn Sie dieses zweite Bit verwenden, können Sie das erste Bit so ändern, dass anstelle von @ "" eine Null übergeben wird, da dieses zweite Bit die erforderliche Umwandlung in @ "" für Sie übernimmt.
In meinem eigenen Projekt, ich brauchte den Fall zu behandeln, dass der Benutzer einen Raum nicht geben, so dass anstelle von @“" I oben eine definierte Token verwendet:
// arbitrary token used internally
#define SEARCH_PRELOAD_CONDITIONAL @"_#preresults#_"
Und es dann intern handhaben, indem sie die Umwandlung zurück zu Null String:
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
if ([searchString isEqualToString: SEARCH_PRELOAD_CONDITIONAL])
searchString = nil;
}
Viel Spaß! :)
great stuff, vielen Dank für dieses – NSTJ
versucht, dies jetzt Tage, um herauszufinden! Danke für die Lösung! –
Nach dem Testen dieser Implementierung möchte ich nun herausfinden, wie der Suchergebniscontainer nicht flackern kann, wenn er der Ansicht hinzugefügt wird. Da es über die 'searchDisplayControllerDidBeginSearch:' Methode hinzugefügt wird, können Sie den dunklen Hintergrund für einen Bruchteil einer Sekunde sehen, bevor die 'searchResultsTableView' angezeigt wird. Irgendwelche Gedanken darüber, wie man das umgehen kann? Ich habe versucht, die Codezeile in der 'searchDisplayControllerDidBeginSearch' in die' searchDisplayControllerWillBeginSearch'-Methode zu verschieben, aber das bringt den dunklen Hintergrund vor die 'searchResultsTableView' –