2010-04-26 2 views
9

UISearchDisplayController è molto utile e l'implementazione della ricerca è piuttosto semplice.UISearchDisplayController - come visualizzare i risultati della ricerca con solo il pulsante di ambito selezionato ma vuota stringa di ricerca

Tuttavia, ho riscontrato un problema quando, nella mia app, voglio visualizzare i risultati della ricerca con una stringa di ricerca vuota ma il pulsante di ambito selezionato.

Sembra che sia necessario immettere una stringa di ricerca per ottenere l'inizializzazione e la visualizzazione della tabella dei risultati della ricerca.

Esistono modi per visualizzare i risultati della ricerca immediatamente dopo che l'utente ha scelto un ambito ma non ha ancora inserito la parola di ricerca?

Grazie Bill

+0

ho la stessa domanda. Qualcuno ha una risposta a questo? –

risposta

2

quando si tocca un nuovo pulsante ambito i fuochi selectedScopeButtonIndex:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption; 

è possibile catturare il fuoco titolo off la ricerca qui utilizzando:

[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption] 

Won' t lavorare sull'indice di scope iniziale, ma potresti semplicemente attivare la ricerca inizialmente in base all'ultimo utilizzato selectedScopeButtonIndex

1

Ero dopo la stessa cosa e ho appena trovato qualcosa nei forum degli sviluppatori Apple: Il UISearchDisplayController è implementato in modo che la tabella dei risultati non venga mostrata fino a quando non viene inserito del testo. C'è anche una segnalazione di bug su questo: ID # 8839635.

Ho lavorato intorno ad esso mettendo un controllo segmentato sotto la barra di ricerca, imitando la barra di ambito.

0

Ecco una soluzione alternativa che utilizza i pulsanti di ambito. La cosa principale è aggiungere un carattere extra per gli obiettivi che si desidera mostrare automaticamente ai risultati della ricerca, ma assicurarsi di rimuoverlo per l'ambito o gli ambiti che non si desidera eseguire.

Sarà necessario implementare searchBar:textDidChange così come searchBar:selectedScopeButtonIndexDidChange:

// scope All doesn't do a search until you type something in, so don't show the search table view 
// scope Faves and Recent will do a search by default 
#define kSearchScopeAll 0 
#define kSearchScopeFaves 1 
#define kSearchScopeRecent 2 

// this gets fired both from user interaction and from programmatically changing the text 
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 
    [self initiateSearch]; 
} 


- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope{ 
    NSString *searchText = self.searchDisplayController.searchBar.text; 
    // if we got here by selecting scope all after one of the others with no user input, there will be a space in the search text 

    NSString *strippedText = [searchText stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
    if ((selectedScope == kSearchScopeAll) && (strippedText.length == 0) && (searchText.length != 0)){ 
     self.searchDisplayController.searchBar.text = @""; 
    } else { 
     [self initiateSearch]; 
    } 
} 

-(void)initiateSearch{ 
    NSString *searchText = self.searchDisplayController.searchBar.text; 
    NSInteger scope = self.searchDisplayController.searchBar.selectedScopeButtonIndex; 
    if ((searchText.length == 0) && (scope != kSearchScopeAll)){ 
     self.searchDisplayController.searchBar.text = @" "; 
    } 
    switch (scope) { 
     case kSearchScopeAll: 
      [self searchAll:searchText]; 
      break; 
     case kSearchScopeFaves: 
      [self searchFavorites:searchText]; 
      break; 
     case kSearchScopeRecent: 
      [self searchRecents:searchText]; 
      break; 

     default: 
      break; 
    } 
} 

// assume these trim whitespace from the search term 
-(void)searchAll:(NSString *)searchText{ 
} 

-(void)searchFavorites:(NSString *)searchText{ 
} 

-(void)searchRecents:(NSString *)searchText{ 
}