Barre de recherche et la Recherche de contrôle de l'Affichage dans la vue tableau
J'ai essayé de mettre en œuvre une barre de recherche mais je n'ai pas eu la chance de régler ce problème. Je serais vraiment reconnaissant de toute aide qui peut être apportée. J'ai un grand projet dans lequel j'ai une vue de la table, et je veux le mettre en œuvre une barre de recherche et voir le filtrage en temps réel. Je n'utilisez pas de Storyboard mais je suis en utilisant XIB. J'ai ajouté les protocoles suivants:
<UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate,UISearchDisplayDelegate>
J'ai déclaré 2 tableaux dans @interface , la première pour l'ensemble de éléments et un second pour la filtrés par:
NSArray* OldList;
NSArray* filteredList;
Puis j'ai placé le nombre de lignes et le nombre de sections et puis:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
myClassCell *cell = [tableView dequeueReusableCellWithIdentifier:MYCELLCLASS];
if (cell == nil)
{
cell = [myClassCell newFromNib];
}
NSMutableDictionary* elem = nil;
if (tableView == self.searchDisplayController.searchResultsTableView)
{
elem = [filteredList objectAtIndex:indexPath.row];
if ([elem count]+1 > indexPath.row)
[cell showValues:elem];
else
[cell showValues:nil];
}
else
{
elem = [OldList objectAtIndex:indexPath.row];
if ([elem count]+1 > indexPath.row)
[cell showValues:elem];
else
[cell showValues:nil];
}
return cell;
}
-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
filteredist = [OldList filteredArrayUsingPredicate:resultPredicate];
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
return YES;
}
À ce point, je n'ai pas fait de modifications apportées à la xib, pas de liens et pas autres choses. Si je compile j'obtiens ma table, mais, évidemment, si j'ai essayer de chercher quelque chose, rien ne fonctionne. D'ailleurs si j'ai faites défiler jusqu'à la fin du tableau, l'application se bloque. Le vrai problème, c'est que je ne peux pas voir la barre de recherche de travail. Quelqu'un pourrait-il m'aider s'il vous plaît?
- Il y a un certain nombre d'éléments manquants à partir de votre code. Ma suggestion est d'exécuter un projet de test à l'aide de Storyboard, faites glisser un
UISearchDisplayController
dans unUITableView
, et d'observer le système automatique de prise de connexions qui sont faites par Xcode. Ces comprendra la définition de la les délégués appropriés. Vous aurez également besoin d'examiner la façon dont votre vue de la table de source de données, les méthodes de préparer lasearchResultsTableView
. Vous trouverez de nombreux bons tutoriels à partir d'une recherche sur Google. Il y a beaucoup de questions AFIN de régler le problème, vous présenter. Si vous êtes toujours bloqué après cela, laissez-moi savoir et je vais vous proposer des suggestions. - Tout d'abord merci pour votre réponse. J'ai cherché une solution sur google et j'ai trouvé intéressant tutiorials, c'est vrai, mais je n'avais pas trouvé un moyen de yo résoudre mon problème (mon mauvais pour être sûr). Je vais essayer d'aller en profondeur dans mon code et je vais essayer de lancer un projet de test avec storyboard, comme vous l'avez suggéré
- J'ai suivi votre suggestion, mais je suis coincé ici. Je pense que le principal problème est lié à la connexion à partir du code de la xib.
- Cela peut aider quelqu'un stackoverflow.com/a/39388169/2033377
Vous devez vous connecter pour publier un commentaire.
Eh bien, vous êtes sur la bonne voie... c'est exactement à voir avec la connexion de votre contrôleur de classe à votre contrôleur xib.
Quand vous voulez initialiser une Barre de Recherche et la Recherche de contrôle de l'Affichage dans un UITableView, vous êtes effectivement l'ajout d'une deuxième table d'avis que, lorsqu'il est activé, doit être géré par le code dans votre
UITableViewController
classe de la même manière que toutUITableView
.J'ai utilisé ces questions/réponses pour vérifier ma propre réponse - je vous recommande de prendre un coup d'oeil:
J'ai lu le La Documentation D'Apple. Je vous recommande de faire la même pour vous aider à comprendre cela.
Première Étape:
Vous devrez configurer la source de données et de déléguer des méthodes pour les deux vues de table lorsque vous exécutez votre contrôleur de classe.
Avant de vous faire tout cela, inclure cette propriété...
Le code suivant décrit comment initialiser et définir les propriétés d'un
UISearchBar
et unUISearchDisplayController
. Si vous êtes par programmation de la création d'unUITableViewController
dans le code, vous aurez aussi besoin de définir la source de données et délégué pour elle (pas montré pour avoir un code facile à lire).Vous avez deux options ici - celui que vous choisissez dépend de votre code et de ce que vous souhaitez obtenir, - soit le jeu de ces dans votre
init
/awakeFromNib
méthodes, ou l'ensemble de ceux-ci dans une de votre table view controller (TVC) du cycle de vie des méthodes.Option D'Un Init
(Note1: Paul Hegarty extraordinaire iTunesU conférences m'a appris à init/éveillé une classe comme suit - de cette façon, vous êtes couvert pour les deux scénarios - vous appeler init ou il peut awakeFromNib.)
OU
Option Deux - TVC Cycle de vie
Note2: peu importe laquelle de ces options que vous choisissez, vous aurez besoin de placer la ligne suivante de code dans votre
viewDidLoad
méthode...Deuxième Étape:
Notes:
La vue de la table qui représente votre jeu de données complet (
OldList
) peut être appelée à l'aide deself.tableView
(PS convention est de commencer chaque variable avec moins de cas afin de changer votre nom de propriété deOldList
àoldList
).La vue de la table qui représente le filtrée ensemble de données (filteredList) peut être appelée à l'aide de
self.searchController.searchResultsTableView
.Alors que vous avez préparé votre
tableView:cellForRowAtIndexPath:
de la source de données la méthode, je suppose que vous avez d'autres sources de données (et peut-être délégué) les méthodes qui doivent être informés de ce qui la vue de la table est la table de la vue, avant qu'ils soient en mesure de fonctionner correctement et de vous fournir pleinement opérationnel et les résultats de la recherche la vue de la table et de la fonction recherche.Par exemple:
et:
Noter qu'il peut y avoir d'autres sources de données (et peut-être délégué) les méthodes qui doivent être informés de ce qui la vue de la table est la table de la vue... je vous laisse le soin de déterminer laquelle de ces méthodes doivent être modifiées, et le code correspondant est nécessaire d'ajuster l'affichage de la table.
Troisième Étape:
Vous sera demandé de vous inscrire une plume et la réutilisation de l'identificateur de vos résultats de recherche en vue tableau.
Je préfère créer un fichier nib (appelé "TableViewCellSearch.xib") qui contient une vue de la table de la cellule, avec la réutilisation de l'identificateur "SearchCell", puis placez le code à inscrire cette plume et la réutilisation de l'identificateur dans la suite de
UISearchDisplayController
méthode du délégué.Il est intéressant de noter que ce code est tout aussi efficace après le bloc de code exemples ci-dessus dans
init
/awakeFromNib
/viewDidLoad
.Essayez ces suggestions.
Espère que cette aide.
UIView
dans votre storyboard hiérarchie au même niveau que leUITableView
. Je vais examiner ce qui est en cause et de répondre à votre question.