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 Bandé 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
}



}


«1

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

     



    func register(_ nib: UINib?, forCellReuseIdentifier identifier: String)
    func register(_ cellClass: AnyClass?, forCellReuseIdentifier identifier: String)


  •  


    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

     



    func register(_ nib: UINib?, forCellReuseIdentifier identifier: String)
    func register(_ cellClass: AnyClass?, forCellReuseIdentifier identifier: String)



     


    Justement j'ai bien l'identifiant dans le storyboard

  • Un problème de typo sur l'identifiant peut être ?


  • Un problème de typo sur l'identifiant peut être ?




     


    ce qui es bizarre c'est que cela fonction lorsque je ne met pas mon cell en custum

  • LexxisLexxis Membre
    mars 2017 modifié #6
    une question (dont la réponse pourrait paraà®tre évidente); le problème survient lorsque tu effectue une recherche avec le searchcontroller c'est ca ?


    Parce que dans ce cas (mais je peux me tromper) la tableview de "resultController" est une UITavleView basique sans cellule custom.
  • Joanna CarterJoanna Carter Membre, Modérateur
    mars 2017 modifié #7

    @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 :



    struct Technique
    {
    enum `Type` : String
    {
    case Position
    case Blocage
    case Attaque
    }

    var nom: String

    var type: `Type`

    var image: UIImage?
    }

    class ListP1TableViewController: UITableViewController, UISearchResultsUpdating
    {
    let techniques = [Technique(nom: "Tchaliot Seugui Kyongnye", type: .Position, image: UIImage(named: "back1")),
    Technique(nom: "Tchoumbi Seugui", type: .Position, image: UIImage(named: "back1")),
    Technique(nom: "Ale Maki", type: .Blocage, image: UIImage(named: "back1")),
    Technique(nom: "Montong Bandé Jileugui", type: .Attaque, image: UIImage(named: "back1")),
    Technique(nom: "Montong Baro Jileugui", type: .Attaque, image: UIImage(named: "back5")),
    Technique(nom: "Montong An Maki", type: .Blocage, image: UIImage(named: "back6")),
    Technique(nom: "Eulgoul Maki", type: .Blocage, image: UIImage(named: "back7")),
    Technique(nom: "Aptchagui", type: .Attaque, image: UIImage(named: "back8")),
    Technique(nom: "Ap Seugui", type: .Position, image: UIImage(named: "back1")),
    Technique(nom: "Ap Koubi", type: .Position, image: UIImage(named: "back2"))
    ]

    var filtreTechnique: [Technique]?

    lazy var searchController: UISearchController =
    {
    let searchController = UISearchController(searchResultsController: nil)

    searchController.searchResultsUpdater = self

    searchController.dimsBackgroundDuringPresentation = false

    searchController.hidesNavigationBarDuringPresentation = false

    self.definesPresentationContext = true

    searchController.searchBar.autocapitalizationType = .none

    return searchController
    }()

    override func viewDidLoad()
    {
    super.viewDidLoad()

    self.tableView.tableHeaderView = self.searchController.searchBar
    }

    func updateSearchResults(for searchController: UISearchController)
    {
    self.filtreTechnique = self.techniques.filter
    {
    technique in

    let searchText = searchController.searchBar.text ?? ""

    return technique.nom.lowercased().contains(searchText.lowercased())
    }

    self.tableView.reloadData()
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
    if let filtreTechnique = self.filtreTechnique,
    filtreTechnique.count > 0
    {
    return filtreTechnique.count
    }
    else
    {
    return techniques.count
    }
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
    let cell = self.tableView.dequeueReusableCell(withIdentifier: "listeP1Cell", for: indexPath) as! MouvementP1TableViewCell

    let indexRow = indexPath.row

    var techniqueSource: [Technique]

    if let filtreTechnique = self.filtreTechnique,
    filtreTechnique.count > 0
    {
    techniqueSource = filtreTechnique
    }
    else
    {
    techniqueSource = techniques
    }

    cell.nomTechniqueLBL.text = techniqueSource[indexRow].nom

    cell.typeTechniqueLBL.text = techniqueSource[indexRow].type.rawValue

    cell.mouvementImageVew.image = techniqueSource[indexRow].image

    return cell
    }
    }



  • une question (dont la réponse pourrait paraà®tre évidente); le problème survient lorsque tu effectue une recherche avec le searchcontroller c'est ca ?


    Parce que dans ce cas (mais je peux me tromper) la tableview de "resultController" est une UITavleView basique sans cellule custom.




     


    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
    }


     


     


     


    ???



  •  


    @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 :



    struct Technique
    {
    enum `Type` : String
    {
    case Position
    case Blocage
    case Attaque
    }

    var nom: String

    var type: `Type`

    var image: UIImage?
    }

    class ListP1TableViewController: UITableViewController, UISearchResultsUpdating
    {
    let techniques = [Technique(nom: "Tchaliot Seugui Kyongnye", type: .Position, image: UIImage(named: "back1")),
    Technique(nom: "Tchoumbi Seugui", type: .Position, image: UIImage(named: "back1")),
    Technique(nom: "Ale Maki", type: .Blocage, image: UIImage(named: "back1")),
    Technique(nom: "Montong Bandé Jileugui", type: .Attaque, image: UIImage(named: "back1")),
    Technique(nom: "Montong Baro Jileugui", type: .Attaque, image: UIImage(named: "back5")),
    Technique(nom: "Montong An Maki", type: .Blocage, image: UIImage(named: "back6")),
    Technique(nom: "Eulgoul Maki", type: .Blocage, image: UIImage(named: "back7")),
    Technique(nom: "Aptchagui", type: .Attaque, image: UIImage(named: "back8")),
    Technique(nom: "Ap Seugui", type: .Position, image: UIImage(named: "back1")),
    Technique(nom: "Ap Koubi", type: .Position, image: UIImage(named: "back2"))
    ]

    var filtreTechnique: [Technique]?

    lazy var searchController: UISearchController =
    {
    let searchController = UISearchController(searchResultsController: nil)

    searchController.searchResultsUpdater = self

    searchController.dimsBackgroundDuringPresentation = false

    searchController.hidesNavigationBarDuringPresentation = false

    self.definesPresentationContext = true

    searchController.searchBar.autocapitalizationType = .none

    return searchController
    }()

    override func viewDidLoad()
    {
    super.viewDidLoad()

    self.tableView.tableHeaderView = self.searchController.searchBar
    }

    func updateSearchResults(for searchController: UISearchController)
    {
    self.filtreTechnique = self.techniques.filter
    {
    technique in

    let searchText = searchController.searchBar.text ?? ""

    return technique.nom.lowercased().contains(searchText.lowercased())
    }

    self.tableView.reloadData()
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
    if let filtreTechnique = self.filtreTechnique,
    filtreTechnique.count > 0
    {
    return filtreTechnique.count
    }
    else
    {
    return techniques.count
    }
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
    let cell = self.tableView.dequeueReusableCell(withIdentifier: "listeP1Cell", for: indexPath) as! MouvementP1TableViewCell

    let indexRow = indexPath.row

    var techniqueSource: [Technique]

    if let filtreTechnique = self.filtreTechnique,
    filtreTechnique.count > 0
    {
    techniqueSource = filtreTechnique
    }
    else
    {
    techniqueSource = techniques
    }

    cell.nomTechniqueLBL.text = techniqueSource[indexRow].nom

    cell.typeTechniqueLBL.text = techniqueSource[indexRow].type.rawValue

    cell.mouvementImageVew.image = techniqueSource[indexRow].image

    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 

  • Joanna CarterJoanna Carter Membre, Modérateur


    Oui c'est exactement ça


     


    du coup je doit faire :


     


     


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    ...


     


    ???




     


    Bah non  :s


     


    Regardes mon autre message  B)


  • Oui c'est exactement ça

     

    du coup je doit faire :


    ...




    Non car une UITableViewCell n'a pas les outlets nomTechniqueLBLtypeTechniqueLBL 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.

     




  • Bah non  :s


     


    Regardes mon autre message  B)




     


    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

  • Joanna CarterJoanna Carter Membre, Modérateur
    mars 2017 modifié #13


    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]


     

    Avec les structs, tu aurais tous les attributs de chaque "Technique" dans le même "objet" ; du coup, quand tu les filtres, les types et les images resteront dans les mêmes "objets" que les noms.

     

    Tu comprends mieux ?



  •  


    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]


     

    Avec les structs, tu aurais tous les attributs de chaque "Technique" dans le même "objet" ; du coup, quand tu les filtres, les types et les images resteront dans les mêmes "objets" que les noms.

     

    Tu comprends mieux ?

     




     


    c'est parfaitement clair.


     


    Je te remercie pour tes explications

  • Joanna CarterJoanna Carter Membre, Modérateur


    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 ?



  • 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

  • rollanorollano Membre
    mars 2017 modifié #17

    C'est vraiment magnifique ça fonction bien  :)


     


    Merci encore  



  • Et l'enum, tu comprends comment on arrive à  avoir les noms des types en utilisant le rawValue ?




    C'est vraiment magnifique ça fonction bien  :)


     


    Merci encore  

  • rollanorollano Membre
    mars 2017 modifié #19
    J'ai un petit souci d'index lorsque je cherche a faire passer les infos sur une details view. c'est l'index de la tableview de recherche qui est reporter

     

    Plus de problème avec la liste.

     

     



    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "segueForPositionDefition" {

    let destinationViewController = segue.destination as! techniqueP1DetailTableViewController

    let indexPath = tableView.indexPathForSelectedRow!

    let indexRow = indexPath.row

    //pass data
    destinationViewController.title = self.techniques[indexRow].nom

    destinationViewController.image = self.techniques[indexRow].image!


    destinationViewController.deplacementText = self.techniques[indexRow].deplacement

    destinationViewController.armementText = self.techniques[indexRow].armement

    destinationViewController.realisationText = self.techniques[indexRow].realisation

    destinationViewController.definitionText = self.techniques[indexRow].definition

    }
    }

  • Joanna CarterJoanna Carter Membre, Modérateur


     


    J'ai un petit souci d'index lorsque je cherche a faire passer les infos sur une details view. c'est l'index de la tableview de recherche qui est reporter



     


    C'est car tu dois déterminer quelle liste est valable - filtrée ou normale.



    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
    guard segue.identifier == "segueForPositionDefition",
    let destinationViewController = segue.destination as? TechniqueP1DetailTableViewController,
    let indexRow = tableView.indexPathForSelectedRow?.row else
    {
    return
    }

    var techniqueSource: [Technique]

    if let filtreTechnique = self.filtreTechnique,
    filtreTechnique.count > 0
    {
    techniqueSource = filtreTechnique
    }
    else
    {
    techniqueSource = techniques
    }

    destinationViewController.title = techniqueSource[indexRow].nom

    destinationViewController.image = techniqueSource[indexRow].image

    destinationViewController.deplacementText = techniqueSource[indexRow].deplacement

    destinationViewController.armementText = techniqueSource[indexRow].armement

    destinationViewController.realisationText = techniqueSource[indexRow].realisation

    destinationViewController.definitionText = techniqueSource[indexRow].definition
    }

    Mais, pour améliorer ton code, tu devrais changer ta TechniqueP1DetailTableViewController



    class TechniqueP1DetailViewController : UIViewController
    {
    var technique: Technique?

    @IBOutlet private weak var imageView: UIImageView!

    @IBOutlet private weak var deplacementLabel: UILabel!

    @IBOutlet private weak var armementLabel: UILabel!

    @IBOutlet private weak var realisationLabel: UILabel!

    @IBOutlet private weak var definitionLabel: UILabel!

    override func viewDidLoad()
    {
    super.viewDidLoad()

    guard let technique = self.technique else
    {
    return
    }

    self.imageView.image = technique.image

    self.deplacementLabel.text = technique.deplacement

    self.armementLabel.text = technique.armement

    self.realisationLabel.text = technique.realisation

    self.definitionLabel.text = technique.definition
    }
    }

    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 :



    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
    guard segue.identifier == "segueForPositionDefition",
    let destinationViewController = segue.destination as? TechniqueP1DetailViewController,
    let indexRow = tableView.indexPathForSelectedRow?.row else
    {
    return
    }

    var techniqueSource: [Technique]

    if let filtreTechnique = self.filtreTechnique,
    filtreTechnique.count > 0
    {
    techniqueSource = filtreTechnique
    }
    else
    {
    techniqueSource = techniques
    }

    destinationViewController.technique = techniqueSource[indexRow]
    }
    }
  • Merci mille fois Joanna.


     


    une question un p hors sujet


     


    Tu es à  ton compte en tant que développeur ? Uniquement ios ou hybride ?


  • Joanna CarterJoanna Carter Membre, Modérateur


    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.

  • Joanna CarterJoanna Carter Membre, Modérateur

    En plus d'ajouter la var technique dans ton contrôleur, tu pourrait faire presque la même chose pour ta cellule :



    class MouvementP1TableViewCell : UITableViewCell
    {
    var technique: Technique?
    {
    didSet
    {
    guard let technique = technique else
    {
    return
    }

    self.nomTechniqueLBL.text = technique.nom

    self.typeTechniqueLBL.text = technique.type.rawValue

    self.mouvementImageVew.image = technique.image
    }
    }

    @IBOutlet private weak var nomTechniqueLBL: UILabel!

    @IBOutlet private weak var typeTechniqueLBL: UILabel!

    @IBOutlet private weak var mouvementImageVew: UIImageView!
    }

    Et le code pour dequeuer la cellule :



    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
    let cell = self.tableView.dequeueReusableCell(withIdentifier: "listeP1Cell", for: indexPath) as! MouvementP1TableViewCell

    let indexRow = indexPath.row

    var techniqueSource: [Technique]

    if let filtreTechnique = self.filtreTechnique,
    filtreTechnique.count > 0
    {
    techniqueSource = filtreTechnique
    }
    else
    {
    techniqueSource = techniques
    }

    cell.technique = techniqueSource[indexRow]

    return cell
    }


  • 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.




     


     


    Je suis impressionné  o:)


     


    As-tu une fiche de référence ou une plaquette commerciale ?

  • rollanorollano Membre
    mars 2017 modifié #25


     


    En plus d'ajouter la var technique dans ton contrôleur, tu pourrait faire presque la même chose pour ta cellule :



    class MouvementP1TableViewCell : UITableViewCell
    {
    var technique: Technique?
    {
    didSet
    {
    guard let technique = technique else
    {
    return
    }

    self.nomTechniqueLBL.text = technique.nom

    self.typeTechniqueLBL.text = technique.type.rawValue

    self.mouvementImageVew.image = technique.image
    }
    }

    @IBOutlet private weak var nomTechniqueLBL: UILabel!

    @IBOutlet private weak var typeTechniqueLBL: UILabel!

    @IBOutlet private weak var mouvementImageVew: UIImageView!
    }

    Et le code pour dequeuer la cellule :



    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
    let cell = self.tableView.dequeueReusableCell(withIdentifier: "listeP1Cell", for: indexPath) as! MouvementP1TableViewCell

    let indexRow = indexPath.row

    var techniqueSource: [Technique]

    if let filtreTechnique = self.filtreTechnique,
    filtreTechnique.count > 0
    {
    techniqueSource = filtreTechnique
    }
    else
    {
    techniqueSource = techniques
    }

    cell.technique = techniqueSource[indexRow]

    return cell
    }



     


     


    le précédent fonctionnait parfaitement bien.


     


    Je vais rajouter ces modifs    :)


     


    Merci 


  • Joanna CarterJoanna Carter Membre, Modérateur


    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--)  ::)



  • 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

  • rollanorollano Membre
    avril 2017 modifié #28
    Bonjour tout le monde,

     

    J'ai une petite question, comment dois-je procéder pour lier mon app avec un Fichier Json contenant mes éléments de recherche ?

     

    Comment doit être constitué le fichier JSON pour faire le minimum de modification dans mon code. 

     

    J'ai trop de données à  gérer entre les recherches et les quiz, une erreur est vite arrivée.

     

     

    Exemple de donner a récupérer :

     


     


    let techniques = [Technique(nom: "Tchaliot Seugui Kyongnye", type: .Position, image: UIImage(named: "back1")),
    Technique(nom: "Tchoumbi Seugui", type: .Position, image: UIImage(named: "back1")),
    Technique(nom: "Ale Maki", type: .Blocage, image: UIImage(named: "back1")),
    Technique(nom: "Montong Bandé Jileugui", type: .Attaque, image: UIImage(named: "back1")),
    Technique(nom: "Montong Baro Jileugui", type: .Attaque, image: UIImage(named: "back5")),
    Technique(nom: "Montong An Maki", type: .Blocage, image: UIImage(named: "back6")),
    Technique(nom: "Eulgoul Maki", type: .Blocage, image: UIImage(named: "back7")),
    Technique(nom: "Aptchagui", type: .Attaque, image: UIImage(named: "back8")),
    Technique(nom: "Ap Seugui", type: .Position, image: UIImage(named: "back1")),
    Technique(nom: "Ap Koubi", type: .Position, image: UIImage(named: "back2"))
    ]

  • LarmeLarme Membre
    avril 2017 modifié #29

    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).




  • 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.


Connectez-vous ou Inscrivez-vous pour répondre.