web-dev-qa-db-fra.com

UisearchDisplayController sans résultats TableView?

Habituellement, une uisearchDisplayController, lorsqu'elle est activée, sombre, la TableView et concentre la barre de recherche. Dès que vous entrez du texte dans la barre de recherche, il crée une vision de rechercheResulttable qui s'affiche entre la barre de recherche et le clavier. Le délégué de SearchDisplayController est appelé lorsque ce second UitableView est chargé/affiché/caché/déchargé. Habituellement, il montre des résultats de recherche en direct ou des entrées d'autocompletion tout en tapant.

Dans mon application, je souhaite rechercher un service Web et je ne veux pas appeler le service Web pour chaque lettre que l'utilisateur entre. Par conséquent, je souhaite désactiver entièrement la rechercheResulttableView et conserver la superposition noire atténuée pendant son entrée en texte. Je déclencherais alors la recherche (avec un écran de chargement) une fois qu'il frappe le bouton de recherche.

Il suffit de retourner zéro rangs pour la rechercheResultTableView ne regarde pas bien, car il affiche une recherche videsResultsTableView avec un message "Aucun résultat". J'ai essayé de cacher la table quand il apparaît (searchDisplayController:didLoadSearchResultsTableView:) qui fonctionne, mais la superposition de graisse noircée est également cachée de sorte que la vision de table sous-jacente soit complètement visible à nouveau.

Des idées en plus de recréer la fonctionnalité UisearchDisplayController à partir de zéro?

42
Zargony

voici un petit truc que je viens de comprendre et que vous devez également retourner 0 résultats lors de la modification derstring

- (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 allez comprendre quoi faire ensuite

38
user182820

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 de 1/5Sec, vous ne faites qu'un appel Web.

19
Raymond W

Rien de ce qui précède ne semblait bien fonctionner à la fin. Je suis donc proposé avec ce qui suit (vous devez appeler RemoveTableHeader lorsque vous êtes prêt à afficher 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 fait la table transparente, ajoute une en-tête de table noir/translucide de la même taille que la table et désactive le défilement sur la table afin que vous ne puissiez pas obtenir au-dessus ou au-dessus de l'en-tête. En tant que bonus, vous pouvez ajouter quelque chose à la vue en-tête ("Veuillez patienter ..." ou un indicateur d'activité).

9
Barry Haanstra

A eu le même problème que vous, je l'ai géré par ---a) Réglage de l'alpha de la rechercheResultTableView to 0 Lorsque vous commencez la recherche, puis par B) Ajout/suppression de la supervision à la vue de la vue de la vue. 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
9
cvursache

Basé sur le code de User182820 ci-dessous est ma version. Je cache la vue de la table de l'UISEarchDisplayController. Lorsqu'un caractère est entré dans la zone de recherche, je place une "vue atténuée", il semble donc que l'UISEarchDisplayController's 'Dimmed View' ''s''s ''s n'a jamais disparu, puis supprimez-la lorsque la recherche est terminée. Si vous entrez des caractères et appuyez sur Annuler, la vue de table va brièvement tout blanc et je ne sais pas comment se déplacer.

- (void)viewDidLoad {
    ...
    tableViewMask=[UIView new];
    tableViewMask.backgroundColor = [UIColor blackColor];
    tableViewMask.alpha = 0.8;
}

- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller{
    tableViewMask.frame=CGRectMake(self.tableView.frame.Origin.x, self.tableView.frame.Origin.y+controller.searchBar.frame.size.height, self.tableView.frame.size.width, self.tableView.frame.size.height-controller.searchBar.frame.size.height);
    controller.searchResultsTableView.hidden=YES;
}

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller{
    [tableViewMask removeFromSuperview];
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
    if (searchString.length==0)
        [tableViewMask removeFromSuperview];
    else 
        [self.tableView addSubview:tableViewMask];
    [searchText autorelease];
    searchText=[searchString retain];
    return NO;
}   
2
Mark Horgan

Qu'en est-il de le faire aussi simple que ceci:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
self.searchDisplayController.searchResultsTableView.hidden=YES;
return YES;
}

Fonctionne bien pour moi ..

2
ingenspor

Toutes les réponses existantes sont trop compliquées. Vous pouvez vous échapper en cachant simplement la vue Table des résultats immédiatement.

-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView
{
    tableView.hidden = YES;
}
1
Chris Allwein

J'ai trouvé une meilleure façon, car il y a un bug avec la "meilleure réponse" - le séparateur et le "Aucun résultat" seront affichés lors du défilement de la table d'arrière-plan noir.

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

    controller.searchResultsTableView.backgroundColor = [UIColor blackColor];
    controller.searchResultsTableView.alpha = 0.8;
    controller.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    for(UIView *subview in tableView.subviews) {
        if([subview isKindOfClass:UILabel.class]) {
            subview.hidden = YES;
        }
    }

    return NO;
}

- (void) searchBarSearchButtonClicked:(UISearchBar *)searchBar {

    self.searchDisplayController.searchResultsTableView.backgroundColor = [UIColor whiteColor];
    self.searchDisplayController.searchResultsTableView.alpha = 1;
    self.searchDisplayController.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;

    for(UIView *subview in tableView.subviews) {
        if([subview isKindOfClass:UILabel.class]) {
            subview.hidden = NO;
        }
    }

    // search results and reload data ....
}
1
user398952

Je pense avoir trouvé une meilleure mise en œuvre pour ce problème. Toutes les réponses précédentes montrent correctement une vue atténuée identique à ce que l'UitailView ressemble à une recherche, mais chaque solution manque de fonctionnalité pour appuyer sur la zone afin d'annuler la recherche.

Pour cette raison, je pense que ce code fonctionne mieux.

Tout d'abord, créez un bool tel que Searchbuttopped pour indiquer si le bouton de recherche a été exploité. Par défaut, il est non.

Puis:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
if (!searchButtonTapped) {        
    // To prevent results from being shown and to show an identical look to how the tableview looks before a search
    [controller.searchResultsTableView setBackgroundColor:[UIColor clearColor]];
    [controller.searchResultsTableView setRowHeight:160];
    self.searchDisplayController.searchResultsTableView.scrollEnabled = NO;
} else {
    // Restore original settings
    [controller.searchResultsTableView setBackgroundColor:[UIColor whiteColor]];
    [controller.searchResultsTableView setRowHeight:44];
    self.searchDisplayController.searchResultsTableView.scrollEnabled = YES;
}

return YES;
}

Cela devrait être clair maintenant en fonction des autres réponses. Assurez-vous également de restaurer les paramètres d'origine lorsque l'utilisateur tapette sur le bouton de recherche.

De plus, dans la méthode CellforindExpath, ajoutez:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.contentView.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.8];

Afin de créer la même vision DMMMED indiquée avant la saisie du texte. Assurez-vous d'appliquer ces propriétés à la bonne cellule, c'est-à-dire vérifier quelle utableview est active et que l'utilisateur n'a pas taché le bouton de recherche.

Ensuite, cruciale, dans le didacétectrowatidexpath:

if (tableView == self.searchDisplayController.searchResultsTableView) {
    if (searchButtonTapped) {
           // Code for when the user select a row after actually having performed a search
    {
else 
    [self.searchDisplayController setActive:NO animated:YES];

Maintenant, l'utilisateur peut appuyer sur la zone DMMMED, qui n'entraînera pas une sélection visible d'un uableviewCell, mais annule plutôt la recherche.

0
Willem Sleegers