42 votes

UISearchDisplayController sans résultat tableView?

Généralement, un UISearchDisplayController, lorsqu'il est activé, obscurcit la tableView et concentre la barre de recherche. Dès que vous entrez du texte dans la barre de recherche, il crée un searchResultsTableView qui affiche entre la barre de recherche et le clavier. Le searchDisplayController du délégué est appelée lors de cette deuxième UITableView est chargé/montré/caché/décharger. Habituellement, il montre en direct les résultats de la recherche ou de l'auto-complétion des entrées lors de la frappe.

Dans mon application, je recherche un webservice et je ne veux pas l'appeler le webservice pour chaque lettre de l'utilisateur. Donc, je veux désactiver entièrement les searchResultsTableView et de garder la grisé charbonné, alors qu'il pénètre dans le texte. Je serais alors en mesure de déclencher la recherche (avec un écran de chargement) une fois qu'il appuie sur le bouton de recherche.

Juste retour de zéro lignes de la searchResultsTableView n'a pas l'air bien car il affiche un vide searchResultsTableView avec un "pas de résultats" message. J'ai essayé de cacher la table lorsqu'il s'affiche (searchDisplayController:didLoadSearchResultsTableView:) qui fonctionne, mais la masqués grisé superposition est également caché de sorte que le sous-jacent tableView est complètement visible à nouveau.

Des idées en plus de recréer le UISearchDisplayController fonctionnalité à partir de zéro?

38voto

user182820 Points 344

voici un petit truc que je viens de comprendre et vous devez également renvoyer 0 résultats lors de l'édition de searchstring

 - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    savedSearchTerm = searchString;

    [controller.searchResultsTableView setBackgroundColor:[UIColor colorWithWhite:0.0 alpha:0.8]];
    [controller.searchResultsTableView setRowHeight:800];
    [controller.searchResultsTableView setScrollEnabled:NO];
    return NO;
}

- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView
{
    // undo the changes above to prevent artefacts reported below by mclin
}
 

Je pense que vous saurez quoi faire ensuite

19voto

Raymond W Points 415

Avez-vous essayé ceci:

 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(_lookup:) object:nil];
[self performSelector:@selector(_lookup:) withObject:txt afterDelay:0.20];
 

De cette façon, si l'utilisateur tape un autre caractère au bout de 1 / 5sec, vous ne faites qu'un seul appel Web.

9voto

cvursache Points 534

Si vous aviez le même problème que vous, je l'ai traité en a) réglant l'alpha du searchResultsTableView à 0 au début de la recherche, puis en b) ajoutant / supprimant l'overlayView à la vue du viewController. Fonctionne comme un charme pour moi.

 @interface MyViewController()
//...
@property(nonatomic, retain) UIView *overlayView;
//...
@end

@implementation MyViewController
@synthesize overlayView = _overlayView;

//...

- (void)viewDidLoad
{
    //...

    //define your overlayView
    _overlayView = [[UIView alloc] initWithFrame:CGRectMake(0, 44, 320, 480)];
    _overlayView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.8];
}

//hide the searchResultsTableView
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
{
    self.searchDisplayController.searchResultsTableView.alpha = 0.0f;
}

//when ending the search, hide the overlayView
- (void) searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
    [_overlayView removeFromSuperview];
}

//depending on what the user has inputed, add or remove the overlayView to the view of the current viewController 
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{   

    if ([searchString length]>0) 
    {
        [self.view addSubview:_overlayView];
    }
    else
    {
        [_overlayView removeFromSuperview];
    }

    return NO;
}

@end
 

9voto

Barry Haanstra Points 101

Rien de ce qui précède semble bien fonctionner à la fin, alors je suis venu avec le suivant (vous devez appeler removeTableHeader lorsque vous êtes prêt pour l'affichage de vos résultats):

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
    [self setTableHeader];
}

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    [self setTableHeader];
}

- (void)setTableHeader {
    UIView *headerView = [[UIView alloc] initWithFrame:self.searchDisplayController.searchResultsTableView.frame];
    headerView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.8];

    [self.searchDisplayController.searchResultsTableView setBackgroundColor:[UIColor clearColor]];
    [self.searchDisplayController.searchResultsTableView setScrollEnabled:NO];
    [self.searchDisplayController.searchResultsTableView setTableHeaderView:headerView];

    [headerView release];
}

- (void)removeTableHeader {
    [self.searchDisplayController.searchResultsTableView setBackgroundColor:[UIColor whiteColor]];
    [self.searchDisplayController.searchResultsTableView setScrollEnabled:YES];
    [self.searchDisplayController.searchResultsTableView setTableHeaderView:nil];
}

Évidemment, il rendre le tableau transparent, ajoute un noir/translucide en-tête du tableau de la même taille que le tableau, et désactive le défilement sur la table de sorte que vous ne pouvez pas obtenir au-dessus ou au passé de l'en-tête. Comme un bonus, vous pouvez ajouter quelque chose à la vue d'en-tête ('veuillez patienter..." ou un indicateur d'activité).

2voto

xoconoxtle Points 115

il devrait suffire d'implémenter la méthode suivante dans votre UISearchDisplayDelegate (qui est généralement votre sous-classe UITableViewController personnalisée)

 - (BOOL) searchDisplayController: (UISearchDisplayController *) controller shouldReloadTableForSearchString: (NSString *) searchString
{
    [self startMyCustomWebserviceSearchAsBackgroundProcessForString: searchString]; //starts new NSThread
    return NO; 
}
 

avez-vous essayé cela?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X