SearchBar avec un custum tableviewcell
Bonjour,
je voudrais faire un systeme de recherche dans mon tableview.
seulement j'ai une erreur reason: 'unable to dequeue a cell with identifier listeP1Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard' lorsque j'utilise un custum cell.
des idées svp de ce qui vas pas ?
import UIKit
class ListeP1TableViewController: UITableViewController, UISearchResultsUpdating {
var nomTechnique = ["Tchaliot Seugui Kyongnye","Tchoumbi Seugui","Ale Maki", "Montong BandeÌ Jileugui","Montong Baro Jileugui", "Montong An Maki", "Eulgoul Maki", "Aptchagui", "Ap Seugui", "Ap Koubi"]
var filtreTechnique = [String]()
var typeTechnique = ["Position","Position","Blocage", "Attaque","Attaque", "Blocage", "Blocage", "Attaque", "Position", "Position"]
let imageTechnique = [UIImage(named: "back1"), UIImage(named: "back1"), UIImage(named: "back1"), UIImage(named: "back1"), UIImage(named: "back5"), UIImage(named: "back6"), UIImage(named: "Back7"), UIImage(named: "back8"), UIImage(named: "back1"), UIImage(named: "back2")]
//Mark - 1 : searchController
var searchController : UISearchController!
//Mark - 2 : searchController
var resultsController = UITableViewController()
override func viewDidLoad() {
super.viewDidLoad()
//Mark - 6 : searchController
self.resultsController.tableView.dataSource = self
self.resultsController.tableView.delegate = self
//Mark - 3 : searchController
self.searchController = UISearchController(searchResultsController: self.resultsController)
//Mark - 4 : searchController
self.tableView.tableHeaderView = self.searchController.searchBar
self.searchController.searchResultsUpdater = self
//le fond gris lors de la recherche
self.searchController.dimsBackgroundDuringPresentation = true
//enleve l'espace entre la bar de recherche et le contenue
definesPresentationContext = true
}
//Mark - 5 : searchController
func updateSearchResults(for searchController: UISearchController) {
//Mark - Filter sur la variable
self.filtreTechnique = self.nomTechnique.filter { (technique:String) -> Bool in
if technique.lowercased().contains(self.searchController.searchBar.text!.lowercased()) {
return true
}else{
return false
}
}
//Mark - Update table view data source
self.resultsController.tableView.reloadData()
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
if tableView == self.tableView {
return nomTechnique.count
}else {
return self.filtreTechnique.count
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:MouvementP1TableViewCell = tableView.dequeueReusableCell(withIdentifier: "listeP1Cell", for: indexPath) as! MouvementP1TableViewCell
let indexRow = indexPath.row
if tableView == self.tableView {
cell.nomTechniqueLBL.text = nomTechnique[indexRow]
cell.typeTechniqueLBL.text = typeTechnique[indexRow]
cell.mouvementImageVew?.image = imageTechnique[indexRow]
}else{
cell.nomTechniqueLBL.text = filtreTechnique[indexRow]
cell.typeTechniqueLBL.text = typeTechnique[indexRow]
cell.mouvementImageVew.image = imageTechnique[indexRow]
}
return cell
}
}
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Le message indique simplement qu'aucune UITableViewCell dont l'identifiant serait "listeP1Cell" n'est rattaché à la talbleView en question. Il faut dont soit en créer une dans le storyboard (ou renseigner le champ "identifier" dans IB) ou alors utiliser l'une des méthode suivante de la classe UITableView
Justement j'ai bien l'identifiant dans le storyboard
ce qui es bizarre c'est que cela fonction lorsque je ne met pas mon cell en custum
Parce que dans ce cas (mais je peux me tromper) la tableview de "resultController" est une UITavleView basique sans cellule custom.
@rollano - pourquoi tu utilises deux UITableViewControllers ?
Le problème, c'est parce que tu demandes du deuxième UITableViewController qui n'est, comme dit Lexxis, qu'un UITableViewController dont tu n'as pas ajouté une cellule custom.
Tu n'as pas besoin d'un deuxième UITableViewController et, en plus, tu as trois listes de données que tu accèdes avec un index mais, après le filtrage, tu n'auras pas les mêmes indexes.
Je te conseillerais de construire un struct pour tenir les attributs et un enum pour les trois types de techniques.
Voice du code qui t'aidera :
Oui c'est exactement ça
du coup je doit faire :
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let indexRow = indexPath.row
if tableView == self.tableView {
let cell = TableViewCell()
cell.nomTechniqueLBL.text = nomTechnique[indexRow]
cell.typeTechniqueLBL.text = typeTechnique[indexRow]
cell.mouvementImageVew?.image = imageTechnique[indexRow]
}else{
let cell:MouvementP1TableViewCell = tableView.dequeueReusableCell(withIdentifier: "listeP1Cell", for: indexPath) as! MouvementP1TableViewCell
cell.nomTechniqueLBL.text = filtreTechnique[indexRow]
cell.typeTechniqueLBL.text = typeTechnique[indexRow]
cell.mouvementImageVew.image = imageTechnique[indexRow]
}
return cell
}
???
Wahouuu
Merci beaucoup je vais voir comment tu as fais. mais je sais déjà que cela va me facilité la vie
merci
Bah non
Regardes mon autre message
Non car une UITableViewCell n'a pas les outlets nomTechniqueLBL, typeTechniqueLBL et mouvementImageView.
Ce que tu peux faire par contre c'est créer un NIB ou une classe avec ta cellule puis utiliser l'une des fonctions register que j'ai posté dans un message précédent sur la tableView de ton UITableViewController, ou alors utilisé une seule TableView et voir le code de Joanna (qui est plein de bon conseil) juste au dessus.
Loool j'ai répondu avant de voir ton message.
Je suis entrain de voir pour comprendre ton message. j'avoue n'avoir utiliser qu'une fois le struct et là .... je suis perdu
Tu as utilisé les classes ? Les structs sont presque pareils.
C'est un moyen de rassembler plusieurs données pour décrire une entité.
Dans ton cas, tu veux avoir plusieurs "Techniques". Chaque "Technique" est représenté par son nom, son type et son image.
Si tu restais avec les trois listes de noms, types et images, après que tu as filtré la list des noms, tu n'aurais pas filtrer ni les types, ni les les images. Du coup, tu récupérais une liste qui prend des noms comme-ci :
nom[1]
nom[4]
nom[7]
... et les met dans le liste filtrée comme :
nom[0]
nom[1]
nom[2]
Mais, lorsque tu récupères les types et les images, selon les indexes de la UITableView, tu aurais, des listes d'origine :
index[0] - nom[1] - type[0] - image[0]
index[1] - nom[4] - type[1] - image[1]
index[2] - nom[7] - type[2] - image[2]
c'est parfaitement clair.
Je te remercie pour tes explications
Et l'enum, tu comprends comment on arrive à avoir les noms des types en utilisant le rawValue ?
oui je crois
à‰tant donné qu'il est contenu dans l'objet de "Technique". De plus, ma tableView à évoluer depuis la dernière fois. J'ai plus vraiment besoin de ces types maintenant, c'est comme si j'avais 3 Array (Technique, position et image) donc je les mets comme dans ton exemple pour conserver l'index
C'est vraiment magnifique ça fonction bien
Merci encore
C'est vraiment magnifique ça fonction bien
Merci encore
C'est car tu dois déterminer quelle liste est valable - filtrée ou normale.
Mais, pour améliorer ton code, tu devrais changer ta TechniqueP1DetailTableViewController
1. j'ai changer le nom de la classe car elle n'est pas un contrôleur pour une table.
2. j'ai mis tous les @IBOutlet en private
3. j'ai ajouté une var pour que tu puisse passer la technique en un seul coup, comme ci :
Merci mille fois Joanna.
une question un p hors sujet
Tu es à ton compte en tant que développeur ? Uniquement ios ou hybride ?
Oui, je travaille à mon compte depuis plus de 25 ans. Auparavant pour DOS et Windows avec dBase, Pascal, Clipper, C, C++, Delphi et C# ; depuis 6 ans pour iOS, OS X et MacOS, en Objective-C et Swift.
La plupart de mon travail est comme développeuse et consultante pour les autres entreprises. Mon dernier projet était de faire une appli iPad pour les pilotes d'avions privés avec une appli OS X pour préparer ses données.
En plus d'ajouter la var technique dans ton contrôleur, tu pourrait faire presque la même chose pour ta cellule :
Et le code pour dequeuer la cellule :
Je suis impressionné
As-tu une fiche de référence ou une plaquette commerciale ?
le précédent fonctionnait parfaitement bien.
Je vais rajouter ces modifs
Merci
Outre de mes connaissances en code, je suis spécialiste en analyse et conception orientées objets ; du coup, je peux être un peu obsessionnelle sur l'encapsulation des données 8--) ::)
loool je vois ça xd
Moi j'apprends loool tant que ça fonctionnement je suis Happy looooool
Tu peux créer un fichier .json et l'ajouter à ton bundle.
Tu peux aussi créer un fichier .plist si tu préfères.
L'avantage du plist, c'est que XCode le lit plutôt bien (au niveau UI de la chose, en permettant de folder des parties, etc.) alors qu'un fichier JSON serait just un long string.
Dans tous les cas, il va falloir faire la parsing (si ce n'est déjà fait).
Merci pour ta réponse
Tu peu m'en dire plus sur les formes des fichiers ? comment les constitués etc?
Vu que je conseille le plist : File/New/File/Property List C'est du XML dedans, c'est assez simple.
C'est comme le Info.plist.
Ensuite, voici ce que je conseille :
Vu ton modèle, je recommanderais d'avoir un Array at top level, et ensuite pleins de dictionnaires dedans pour chacune des techniques.
C'est un peu chiant de les créer à la chaà®ne, donc je commence en général par créer avec l'UI le top level et un dictionnaire complet.
Puis Clic droit sur le fichier, Open as Source Code. Là tu vois toutes les balises, et c'est plus pratique pour faire des copiers/collers des structures, certaines données, etc.