SearchBar sous Alamofire

Bonjour rien que moi encore moi,


 


J'avance à  petits pas, avec tous vos aides je commence à  me débrouiller sur certain point pas trop mal à  mon avis.


Voilà  je cherche à  réaliser un moteur de recherche qui va envoyer une requête à  mon serveur et lui demander la réponse en JSON.


 


Pour cela j'ai réfléchi, je me suis dit avec Alamofire fais cela très bien, il faut juste que je rajoute dans ma requête ma demande, quand je remplie Search Bar et que cela se rafraà®chie seul a chaque fois que je tape un mots ou une lettre.





Alamofire.request("https://serveur/api/json_search.php?question=_seach")

C'est ce que je récupère dans mon SearchBar.


 


Mais je ne trouve pas d'exemple qui me montre comment cela se fait.


 


Merci a vous


 


Réponses

  • Bonjour,


     


    Ce week-end je suis pas parvenue a faire mon moteur de recherche, quelqu'un aurai-t-il la gentillesse de m'aider.


     


    Mon but et de faire un moteur de recherche avec Alamofire et JSON


     


    Merci a vous


  • Il fat absolument que tu donnes une partie de ton code pour ce genre de question.


    On a besoin de savoir ce qui est déjà  en place, car il se peut qu'il te manque très peu pour que ça marche, et il y a souvent plusieurs manières différentes, donc bon, autant partir de ce que tu as fait.


    Cela peut aussi nous permettre de relever des erreurs de ton côtés que tu ne verras pas forcément, des erreurs de logiques/code, ou simplement de mauvaises habitudes.


    Essaye de diviser ta tâche en différentes sous-tâches, et dis-nous à  quel endroit tu bloques également.


  • Bonjour Larme,


    OK merci de ton aide je vais faire cela.


  • Voilà  mon code :


     


    SearchTableViewController.swift



    import UIKit
    import Alamofire

    class SearchTableViewController: UITableViewController, UISearchBarDelegate {
    @IBOutlet weak var menuButton:UIBarButtonItem!

    @IBOutlet weak var seachBar: UISearchBar!

    var _personList:[[String:AnyObject]] = []

    override func viewDidLoad() {
    super.viewDidLoad()

    Alamofire.request("http://serveur/ios_app/api/json_search.php")
    .validate()
    .responseJSON { (response) in
    if response.result.isSuccess {
    self._personList = response.result.value as! [[String:AnyObject]]
    self.tableView.reloadData()
    } else {
    print(response.result.error!)
    }
    }

    if revealViewController() != nil {
    menuButton.target = revealViewController()
    menuButton.action = #selector(SWRevealViewController.revealToggle(_:))
    view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    }
    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return _personList.count
    }

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

    let person:[String:AnyObject] = _personList[indexPath.row]
    cell.display(person: person)

    return cell
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "Detail" {
    if let cell = sender as? UITableViewCell {
    if let indexPath = self.tableView.indexPath(for: cell) {
    let selectedPerson = _personList[indexPath.row]

    let personViewController:SearchDetailsViewController = segue.destination as! SearchDetailsViewController
    personViewController._person = selectedPerson
    }

    }
    }
    }
    }

    Puis SearchTableViewCell.swift



    import UIKit
    import Alamofire
    import AlamofireImage

    class SearchTableViewCell: UITableViewCell {

    @IBOutlet weak var villeLabel: UILabel!
    @IBOutlet weak var totalLabel: UILabel!

    @IBOutlet weak var images: UIImageView!

    @IBOutlet weak var images: UIImageView!

    override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
    }

    func display(person:[String:AnyObject]) {
    villeLabel.text = person["ville"] as? String
    totalLabel.text = person["total"] as? String

    if !(person["logo"] is NSNull){
    print("il y a une image dans le JSON")
    print(person["logo"]!)

    // recupère une image distante via AlamofireImage
    Alamofire.request(person["logo"] as! String)
    .responseImage { response in
    //debugPrint(response)
    //print(response.request)
    //print(response.response)
    //debugPrint(response.result)

    if let image = response.result.value {
    print("image downloaded: \(image)")
    self.images.image = image
    }
    }
    }

    if !(person["img"] is NSNull){
    print("il y a une image dans le JSON")
    print(person["img"]! as Any)

    // recupère une image distante via AlamofireImage
    Alamofire.request(person["img"] as! String)
    .responseImage { response in

    if let image1 = response.result.value {
    print("image downloaded: \(image1)")
    self.images.image = image1
    }
    }
    }
    }
    }

    Et SearchDetailsViewController.swift



    import UIKit
    import MapKit
    import CoreLocation
    import SceneKit
    import AlamofireImage
    import Alamofire


    class SearchDetailsViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {


    @IBOutlet weak var titre: UINavigationItem!

    @IBOutlet weak var ui_nom: UILabel!
    @IBOutlet weak var ui_ville: UILabel!

    @IBOutlet weak var ui_totalLabel: UILabel!

    @IBOutlet weak var map: MKMapView!

    @IBOutlet weak var images: UIImageView!

    @IBOutlet weak var images2: UIImageView!

    @IBOutlet weak var tableView: UITableViewCell!

    var _person:[String:AnyObject]?

    override func viewDidLoad() {
    super.viewDidLoad()

    if !(_person?["logo"] is NSNull){
    print("il y a une image dans le JSON")
    print(_person?["logo"]! as Any)

    // recupère une image distante via AlamofireImage
    Alamofire.request(_person?["logo"] as! String)
    .responseImage { response in
    // debugPrint(response)
    // print(response.request)
    // print(response.response)
    // debugPrint(response.result)

    if let image = response.result.value {
    print("image downloaded: \(image)")
    self.images.image = image
    }

    if !(self._person?["img"] is NSNull){
    print("il y a une image dans le JSON")
    print(self._person?["img"]! as Any)

    // recupère une image distante via AlamofireImage
    Alamofire.request(self._person?["img"] as! String)
    .responseImage { response in

    if let image1 = response.result.value {
    print("image downloaded: \(image1)")
    self.images2.image = image1
    }
    }
    }

    }
    }

    map.mapType = MKMapType.standard

    let longitudeString = _person?["Longitude_agence"] as! String?
    //print("longitude: \(longitudeString)")

    let latitudeString = _person?["Latitude_agence"] as! String?
    //print("latitude: \(latitudeString)")

    let doubleLat = Double(latitudeString!)
    let doubleLon = Double(longitudeString!)

    print("doublelat: \(doubleLat)")
    print("doubleLon: \(doubleLon)")

    if doubleLat == nil && doubleLon == nil {
    print ("0")
    }else{
    let location:CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: (doubleLat)!, longitude: (doubleLon)!)

    let span = MKCoordinateSpanMake(0.01, 0.01)
    let region = MKCoordinateRegion(center: location, span: span)
    map.setRegion(region, animated: true)

    let annotation = MKPointAnnotation()
    annotation.coordinate = location
    annotation.title = _person?["nom_agence"] as! String?
    annotation.subtitle = _person?["adresse_agence"] as! String?
    map.addAnnotation(annotation)

    }
    }

    override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(true)

    if NetworkViewController.isConnectedToNetwork() == true
    {

    print("Internet connection OK")
    }
    else
    {
    print("Internet connection FAILED")

    let alert = UIAlertController(title: "No Internet Connection", message: "Make sure your device is connected to the internet.", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
    self.present(alert, animated: true, completion: nil)

    }

    let prefs:UserDefaults = UserDefaults.standard
    let isLoggedIn:Int = prefs.integer(forKey: "ISLOGGEDIN") as Int
    if (isLoggedIn != 1) {
    // self.performSegue(withIdentifier: "goto_login", sender: self)
    } else {
    // self.usernameLabel.text = prefs.value(forKey: "USERNAME") as? String
    }

    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    }

    override func viewWillAppear(_ animated: Bool) {
    if let person = _person {
    self.navigationItem.title = person["nom_1"] as? String
    ui_nom.text = person["nom"] as? String
    // ui_adresse.text = person["adresse"] as? String
    ui_ville.text = person["ville"] as? String
    ui_totalLabel.text = person["total"] as? String
    }

    }

    @IBAction func logoutTapped(_ sender : UIButton) {

    let appDomain = Bundle.main.bundleIdentifier
    UserDefaults.standard.removePersistentDomain(forName: appDomain!)

    self.performSegue(withIdentifier: "goto_login", sender: self)
    }
    }

    Voilà  mon code,


     


    Merci de votre aide,


  • Joanna CarterJoanna Carter Membre, Modérateur

    Alors, c'est evident que tu ne sais pas vraiment comment coder et que tu devais écrit (voir copié ?) sans avoir compris.  ???


     


    Mais, c'est presque Noël ; ton code, amélioré avec plein de trucs et astuces ...



    class SearchTableViewController: UITableViewController, UISearchBarDelegate
    {
    @IBOutlet weak var menuButton: UIBarButtonItem!

    @IBOutlet weak var seachBar: UISearchBar!

    // ne jamais utilises _myVar, surtout pour les vars internals comme tu l'as fait
    // utilises Any au lieu de AnyObject
    // var _personList = [[String : AnyObject]]()

    private var personList = [[String : Any]]() // utilises Any au lieu de AnyObject

    private var selectedCellIndex: Int? // pour enregistrer l'index de la cellule sélectionné

    override func viewDidLoad()
    {
    super.viewDidLoad()

    Alamofire.request("http://serveur/ios_app/api/json_search.php")
    .validate()
    .responseJSON
    {
    [unowned self] response in // il faut capturer self comme unowned pour éviter les "strong reference cycles"

    // utilises guard et let pour éviter les erreurs avec l'unwrapping des !
    guard response.result.isSuccess,
    let retrievedList = response.result.value as? [[String : Any]] else
    {
    print(response.result.error!)

    return
    }

    // tout accès à  l'UI, d'un closure, doit être exécuté sur le fil principal
    DispatchQueue.main.async
    {
    self.tableView.reloadData()
    }
    }

    // je ne pouvais pas tester ce code
    // c'est un peu bizarre
    // n'utilises pas les fonctions pour accéder les vars
    // où se trouvee cette fonction ?

    // if revealViewController() != nil
    // {
    // menuButton.target = revealViewController()
    //
    // menuButton.action = #selector(SWRevealViewController.revealToggle(_:))
    //
    // view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    // }
    }


    // Si tu ne comptes pas ajouter du code dans les fonctions override, supprimes-les
    // override func didReceiveMemoryWarning() {
    // super.didReceiveMemoryWarning()
    // // Dispose of any resources that can be recreated.
    // }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
    return personList.count
    }

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

    // n'utilises pas les fonctions nommées comme display(), ce signifie que tu veuilles faire apparaà®tre la cellule ; en fait tu veux la transmettre le person
    cell.person = personList[indexPath.row]

    return cell
    }

    // Ne fais pas les seques entre une cellule et un UIViewController ; les mets plutôt entre les contrôleurs et implementes cette fonction
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
    {
    self.selectedCellIndex = indexPath.row

    self.performSegue(withIdentifier: "Detail", sender: nil)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
    guard segue.identifier == "Detail",
    let personIndex = selectedCellIndex,
    let personViewController = segue.destination as? SearchDetailsViewController else
    {
    return
    }

    personViewController.person = personList[personIndex]
    }
    }


    class SearchTableViewCell: UITableViewCell
    {
    @IBOutlet weak var villeLabel: UILabel!

    @IBOutlet weak var totalLabel: UILabel!

    @IBOutlet weak var image1: UIImageView!

    @IBOutlet weak var image2: UIImageView!


    // remplaces la fonction display avec un var avec un didSet
    var person: [String : Any]?
    {
    didSet
    {
    // pour assurer que person ne soit pas nil ; il n'y aurait rien à  faire
    guard let person = self.person else
    {
    return
    }

    // dans les lignes suivantes, on peut utiliser ! si on est rassuré que les clés existent
    villeLabel.text = "\(person["ville"]!)"

    totalLabel.text = "\(person["total"]!)"

    // ne jamais utilise NSNull pour telles comparaisons contre nil
    // if !(person["logo"] is NSNull)

    // c'est mieux d'utiliser un if let ou guard
    if let logo = person["logo"]
    {
    print("il y a une image dans le JSON")

    print(logo)

    // recupère une image distante via AlamofireImage
    // Alamofire.request(person["logo"] as! String)
    // .responseImage { response in
    // //debugPrint(response)
    // //print(response.request)
    // //print(response.response)
    // //debugPrint(response.result)
    //
    // if let image = response.result.value {
    // print("image downloaded: \(image)")
    // self.images.image = image
    // }
    // }
    }

    if let image = person["img"]
    {
    print("il y a une image dans le JSON")

    print(image)

    // recupère une image distante via AlamofireImage
    // Alamofire.request(person["img"] as! String)
    // .responseImage { response in
    //
    // if let image1 = response.result.value {
    // print("image downloaded: \(image1)")
    // self.images.image = image1
    // }
    // }
    }
    }
    }

    // supprimes les fonctions suivantes ; elles ne servent à  rien
    // override func awakeFromNib()
    // {
    // super.awakeFromNib()
    // // Initialization code
    // }

    // override func setSelected(_ selected: Bool, animated: Bool)
    // {
    // super.setSelected(selected, animated: animated)
    //
    // // Configure the view for the selected state
    // }
    }


    class SearchDetailsViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate
    {
    // pas nécessaire ; c'est déjà  là  dans tous les classes qui dérivent de UIViewController si on les mets dans un UINavigationController
    // @IBOutlet weak var titre: UINavigationItem!

    // evites d'utiliser les _ dans les noms des vars
    @IBOutlet weak var nomLabel: UILabel!

    @IBOutlet weak var villeLabel: UILabel!

    @IBOutlet weak var totalLabel: UILabel!

    @IBOutlet weak var map: MKMapView!

    @IBOutlet weak var images: UIImageView!

    @IBOutlet weak var images2: UIImageView!

    @IBOutlet weak var tableView: UITableViewCell!

    var person:[String : Any]?
    {
    didSet
    {
    guard let person = self.person else
    {
    return
    }

    //
    }
    }

    // si tu touches person dans cette fonction, tu auras toujours nil, car le var n'est pas encore assigné ; mets plutôt ce code dans le didSet du var
    override func viewDidLoad()
    {
    super.viewDidLoad()

    // tous le code qui concerne person doit être déplacé dans le didSet du var person ; en n'oubliant pas de modifier les closures à  propos self et le code qui touch l'UI, comme dans SearchTableViewController
    }

    override func viewDidAppear(_ animated: Bool)
    {
    super.viewDidAppear(true)

    if NetworkViewController.isConnectedToNetwork() == true
    {
    print("Internet connection OK")
    }
    else
    {
    print("Internet connection FAILED")

    let alert = UIAlertController(title: "No Internet Connection", message: "Make sure your device is connected to the internet.", preferredStyle: .alert)

    alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))

    self.present(alert, animated: true, completion: nil)
    }

    let prefs = UserDefaults.standard

    // let isLoggedIn:Int = prefs.integer(forKey: "ISLOGGEDIN")
    //
    // if (isLoggedIn != 1)
    // {

    // pourquoi pas remplacer isLoggedIn avec un Bool ?

    let isLoggedIn = prefs.bool(forKey: "ISLOGGEDIN")

    if !isLoggedIn
    {
    // self.performSegue(withIdentifier: "goto_login", sender: self)
    }
    else
    {
    // self.usernameLabel.text = prefs.value(forKey: "USERNAME") as? String
    }

    }

    // supprimes les fonctions qui n'appellent que super
    // override func didReceiveMemoryWarning()
    // {
    // super.didReceiveMemoryWarning()
    // // Dispose of any resources that can be recreated.
    // }

    override func viewWillAppear(_ animated: Bool)
    {
    // tu as oublié d'appeler super
    super.viewWillAppear(animated)

    if let person = person
    {
    self.navigationItem.title = person["nom_1"] as? String

    nomLabel.text = person["nom"] as? String

    villeLabel.text = person["ville"] as? String

    totalLabel.text = person["total"] as? String
    }
    }

    @IBAction func logoutTapped(_ sender : UIButton) {

    let appDomain = Bundle.main.bundleIdentifier

    UserDefaults.standard.removePersistentDomain(forName: appDomain!)

    self.performSegue(withIdentifier: "goto_login", sender: self)
    }
    }
  • Merci de ton aide Joanna Carter,


     


    connaitriez vous une tutoriel pour réaliser un moteur de recherche.


     


    Je bloque depuis quelques jours sur cela.


     


    Merci,


  • Joanna CarterJoanna Carter Membre, Modérateur
    décembre 2016 modifié #8

    Je vois que tu n'as pas encore commenté sur les améliorations que j'ai proposé pour ton code.


     


    Si tu continues à  écrire tel mauvais code sans le comprendre, tu auras peu de chance de comprendre comment implémenter un "moteur de recherche" ; sauf si tu ne veux que copier/coller l'oe“uvre de quelqu'un d'autre, en espérant qu'il sache plus que toi.


     


    Un "moteur" doit être rédigé, soit avec une structure, soit avec une classe, séparé du contrôleur, et il faut comprendre comment l'appeler du contrôleur, sur un fil d'arrière plan et comment notifier, du moteur, le contrôleur quand les résultats sont prêts.


     


    En plus, il faut comprendre comment gérer les "strong reference cycles" dans les closures.


     


    Bien sûr, tu pourrais continuer à  empiler le mauvais code sur le mauvais code, mais l'heure arrivera quand tous ce que tu as mal écrit te mordra.


     


    Est-ce que tu as bien compris les changements que j'ai fait dans ton code et pourquoi je les ai fait ?


  • Excuse moi, oui j'ai à  peux prés bien compris ton code, je l'ai implémenté mais rien ne fonctionne pas page blanche, quand je clique sur le SearchBar j'ai cela :



    2016-12-19 17:39:00.091563 ADRESSE [21917:293554] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /Users/toto/Library/Developer/CoreSimulator/Devices/24374466-14AF-46C8-966F-01A8801CBF23/data/Containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
    2016-12-19 17:39:00.091902 ADRESSE [21917:293554] [MC] Reading from private effective user settings.

    Merci de me reprendre

  • Joanna CarterJoanna Carter Membre, Modérateur
    décembre 2016 modifié #10

    Mais, parmi tout ton code, tu ne nous as jamais montré le code qui répond au SearchBar. Comment peut-on t'aider si tu ne nous montrer rien de pertinence ?


  • Bonsoir,


     


    Pour mon code le voici :



    import UIKit
    import Alamofire

    class SearchTableViewController: UITableViewController, UISearchResultsUpdating {

    var Search:[[String:AnyObject]] = []

    override func viewDidLoad() {
    super.viewDidLoad()

    Alamofire.request("http://serveur/api/search.php")
    .validate()
    .responseJSON { (response) in
    if response.result.isSuccess {
    self.Search = response.result.value as! [[String:AnyObject]]
    self.tableView.reloadData()
    } else {
    print(response.result.error!)
    }

    self.resultSearchController = UISearchController(searchResultsController: nil)
    self.resultSearchController.searchResultsUpdater = self
    self.resultSearchController.dimsBackgroundDuringPresentation = false
    self.resultSearchController.searchBar.sizeToFit()

    self.tableView.tableHeaderView = self.resultSearchController.searchBar

    self.tableView.reloadData()
    }

    // if revealViewController() != nil {
    // menuButton.target = revealViewController()
    // menuButton.action = #selector(SWRevealViewController.revealToggle(_:))
    // view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    //}
    }


    var filteredSearch = [String]()
    var resultSearchController = UISearchController()

    override func didReceiveMemoryWarning()
    {
    super.didReceiveMemoryWarning()
    }

    override func numberOfSections(in tableView: UITableView) -> Int
    {
    return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
    if (self.resultSearchController.isActive)
    {
    return self.filteredSearch.count
    }
    else
    {
    return self.Search.count
    }
    }

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

    if (self.resultSearchController.isActive)
    {
    cell!.textLabel?.text = self.filteredSearch[indexPath.row]

    return cell!
    }
    else
    {
    cell!.textLabel?.text = self.Search[indexPath.row]

    return cell!
    }
    }

    func updateSearchResults(for searchController: UISearchController)
    {
    self.filteredSearch.removeAll(keepingCapacity: false)

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
    let array = (self.Search as NSArray).filtered(using: searchPredicate)
    self.filteredSearch = array as! [String]

    self.tableView.reloadData()
    }

    }

    Oui je cherche des codes que je prends en exemple et je copie et essais de comprendre le fonctionnement, cela n'est pas simple sous Swift 3 pas trop de doc en FR, mais voilà . j'essaie c'est ce qui fait grandir une personne que de rien faire.


     


    Voilà , merci à  vous de vos aides,


  • Hello easyd,


     


    Peut-être qu'avant de te lancer dans ton projet principal tu pourrais t'entraà®ner sur des mini-projets plus simples ?


    Copier/coller du code n'est à  mon avis pas une stratégie viable.


    Comprendre en revanche oui !!


     


    Je te conseille de commencer par suivre les vidéos en français qui expliquent tout ce que tu as besoin de comprendre pour faire ton projet. Je pense que c'est du Swift 2 et pas du Swift 3 mais ça c'est un petit détail (que tu pourras corriger tout seul ou en posant des questions ici)


     


    Bon courage, tu as raison quand tu dis ". j'essaie c'est ce qui fait grandir une personne que de rien faire" mais regarde quand même les vidéos !


     


    Colas

  • easydeasyd Membre
    décembre 2016 modifié #13

    Merci Colas,


     


    Pour ton point de vue, mais je pense qu'il y a que sur le terrain que l'on peut bien apprendre, je ne fais pas que copier/coller je lie le code et essais de comprendre son fonctionnement, vu ma jeunesse dans ce domaine j'ai un peu de mal à  comprendre certains points.


    Pour info : je suis inscrit a de nombre court de développement comme chez udemy.com, là  je pratique ce que j'ai appris mais c'est dur au début, comme tout cours.


    Voilà ,


  • Joanna CarterJoanna Carter Membre, Modérateur

    Du coup, comme dit colas, tu profiterais mieux de commencer avec les exercices plus simple. Si tu ne peux pas suivre les conseils d'une consultante en programmation comme moi, je me demandais comment tu espères de t'avancer ; tu continues à  laisser les fonctions qui n'appelent que super dans ton code (c'est pas grande chose mais ça me dit que tu ne veux pas vraiment t'avancer)


     


    Si tu ne voulais pas suivre les conseils de colas, tu devrais apprendre assez d'anglais afin que tu puisses rechercher et suivre les tutos dont la plupart sont en anglais.


     


    Il y en a un sur le search ici : https://www.raywenderlich.com/113772/uisearchcontroller-tutorial

  • easydeasyd Membre
    décembre 2016 modifié #15

    Si quelqu'un peux m'aider voilà  mon code :



    code supprimé car ce n'est qu'une répétition avec toutes ses fautes

    Merci de vos aides, je bloque et arrive par affaire de recherche dans l'appli,

    À l'ouverture j'ai bien le contenue, quand je clique sur SEARCHBAR et écrit ma recherche rien ne fonctionne.

    Et quand je quitte la SEARCHBAR j'ai plus rien de ce qui était afficher. votre aide me permettrait de comprendre ou je pêche.


     


    Merci,


  • Joanna CarterJoanna Carter Membre, Modérateur
    décembre 2016 modifié #16
    Soit que tu trouves un tutoriel en français, soit que tu suives les bons tutoriels de Ray Wenderlich en anglais, il te servirait mieux que de re-poster ton codes avec toutes ses fautes.
  • OK merci a toi,


     


    j'y vais


  • easydeasyd Membre
    janvier 2017 modifié #18

    Bonjour,


     


    J'avance a petit pas et pas trop mal.


     


    je n'arrive pas a me dépatouiller de ce problème, quelqu'un pourrai m'aider.


     


    voilà  mon code



    import UIKit
    import Alamofire
    import SwiftyJSON

    class TableViewController: UITableViewController, UISearchResultsUpdating {

    var filteredTableData = [NSString]()
    var resultSearchController = UISearchController()

    var tableData:[[String:AnyObject]] = []

    var dict: [String: AnyObject] = [:]

    override func viewDidLoad() {
    super.viewDidLoad()

    self.resultSearchController = ({
    let controller = UISearchController(searchResultsController: nil)
    controller.searchResultsUpdater = self
    controller.dimsBackgroundDuringPresentation = false
    controller.searchBar.sizeToFit()

    self.tableView.tableHeaderView = controller.searchBar

    return controller
    })()

    Alamofire.request("http:serveur/api/json_list_nom_ville.php")
    .validate()
    .responseJSON { (response) in
    if response.result.isSuccess {
    self.tableData = response.result.value as! [[String:AnyObject]]
    print(self.tableData)

    self.tableView.reloadData()
    } else {
    print(response.result.error!)
    }
    }
    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if (self.resultSearchController.isActive) {
    return self.filteredTableData.count
    }
    else {
    return self.tableData.count
    }
    }

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

    if (self.resultSearchController.isActive) {
    cell.textLabel?.text = filteredTableData[indexPath.row] as String

    return cell
    }
    else {
    cell.textLabel?.text = tableData[indexPath.row] //bloque là 
    //il me dit : TableViewController.swift:77:47:
    Cannot assign value of type '[String : AnyObject]' to type 'String?'

    return cell
    }
    }


    func updateSearchResults(for searchController: UISearchController)
    {
    filteredTableData.removeAll(keepingCapacity: false)

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
    let array = (tableData as NSArray).filtered(using: searchPredicate)
    filteredTableData = array as! [NSString]

    print(filteredTableData)

    self.tableView.reloadData()

    }
    }

    la forme du fichier php :


     




    [{"nom":"toto","ville":"DIJON","id_nom":"1"},{"nom":"tutu","ville":"MARSEILLE","id_nom":"2"},{"nom":"TOUTOU","ville":"PARIS","id_nom":"3"}]


     


    Ce que je cherche a faire c'est toujours mon moteur de recherche.


     


    Je voudrais pouvoir récupérer ces trois informations, afficher que les deux première pour le recherche et le troisième (ID_NOM) pour le détailles que l'on peux voir en un clique sur le résultat de ça recherche.


     


    Merci beaucoup de cotre aide,


    Je désespère beaucoup :'( :'( :'( mais j'avance a petit pas,


     


    Sans votre aide je ne sais comment je ferais, merci en encore.


  • je vient de faire des modification mais rien ne s'affiche


     


    juste sur le terminal, ma recherche fonctionne mais vide



    import UIKit
    import Alamofire
    import SwiftyJSON

    class TableViewController: UITableViewController, UISearchResultsUpdating {

    var filteredTableData:[String] = []

    var resultSearchController = UISearchController()

    var tableData:[String] = []

    var dict: [String: AnyObject] = [:]

    override func viewDidLoad() {
    super.viewDidLoad()

    self.resultSearchController = ({
    let controller = UISearchController(searchResultsController: nil)
    controller.searchResultsUpdater = self
    controller.dimsBackgroundDuringPresentation = false
    controller.searchBar.sizeToFit()

    self.tableView.tableHeaderView = controller.searchBar

    return controller
    })()

    Alamofire.request("http://serveur/api/json_list_nom_ville.php")
    .validate()
    .responseJSON { (response) in
    if response.result.isSuccess {
    let tableData = response.result.value

    print(tableData!)

    self.tableView.reloadData()
    } else {
    print(response.result.error!)
    }
    }
    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if (self.resultSearchController.isActive) {
    return self.filteredTableData.count
    }
    else {
    return self.tableData.count
    }
    }

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

    if (self.resultSearchController.isActive) {

    cell.textLabel?.text = filteredTableData[indexPath.row]


    return cell
    }
    else {
    cell.textLabel?.text = tableData[indexPath.row]

    return cell
    }
    }


    func updateSearchResults(for searchController: UISearchController)
    {
    filteredTableData.removeAll(keepingCapacity: false)

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
    let array = (tableData as NSArray).filtered(using: searchPredicate)
    filteredTableData = array as! [String]

    print(filteredTableData)

    self.tableView.reloadData()

    }
    }

  • "let tableData = response.result.value"

    Essaye d'enlever le "let" .

  • Bonjour,


     


    J'ai retirer le "let" mais j'ai cela maintenant 



    Could not cast value of type '__NSDictionaryI' (0x104d4d0b8) to 'NSString'

    Merci,


  • Joanna CarterJoanna Carter Membre, Modérateur

    Mais bien sûr. Tu as change :



    var tableData:[[String:AnyObject]] = []

    à 



    var tableData:[String] = []

    Qu'est-ce que tu attendais ?


  • Bonjour,


     


    J'ai fait quelques modification, cela fonctionne bien je voie bien mes donner et je peux passer d'une storyboard a l'autre avec les details.


     


    Quant je clique que le search bar et que je fait un recherche pas de résultat.


    je commence vraiment a désespérer.


     


    voilà  mon code :



    import UIKit
    import Alamofire
    import SwiftyJSON

    class TableViewController: UITableViewController, UISearchResultsUpdating {

    var filteredTableData:[Any] = []
    var resultSearchController = UISearchController()
    // var tableData:[String: AnyObject] = [:]

    var tableData:[[String:AnyObject]] = []


    var dict: [String:AnyObject] = [:]

    override func viewDidLoad() {
    super.viewDidLoad()

    self.resultSearchController = ({

    let controller = UISearchController(searchResultsController: nil )
    controller.searchResultsUpdater = self
    controller.dimsBackgroundDuringPresentation = false
    controller.searchBar.sizeToFit()

    self.tableView.tableHeaderView = controller.searchBar

    return controller
    })()

    Alamofire.request("http://serveur/api/json_list_nom_ville.php")
    .validate()
    .responseJSON { (response) in
    if response.result.isSuccess {
    self.tableData = response.result.value as! [[String:AnyObject]]
    print(self.tableData)
    self.tableView.reloadData()
    } else {
    print(response.result.error!)
    }
    }

    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if (self.resultSearchController.isActive) {
    return self.filteredTableData.count
    } else {
    return tableData.count
    }
    }

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


    // 3
    if (self.resultSearchController.isActive) {
    //cell.textLabel?.text = filteredTableData[indexPath.row]

    let person:[String:Any] = filteredTableData[indexPath.row] as! [String:Any]
    cell.display(person: person as [String : AnyObject])


    return cell
    }
    else {
    //cell.textLabel?.text = tableData[indexPath.row]

    let person:[String:Any] = tableData[indexPath.row]
    cell.display(person: person as [String:AnyObject])


    return cell
    }
    }

    func updateSearchResults(for searchController: UISearchController)
    {
    filteredTableData.removeAll(keepingCapacity: false)

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
    let array = (tableData as NSArray).filtered(using: searchPredicate)
    filteredTableData = array

    //print(filteredTableData)

    self.tableView.reloadData()
    }


    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetail" {
    if let cell = sender as? UITableViewCell {
    if let indexPath = self.tableView.indexPath(for: cell) {
    let selectedPerson = tableData[indexPath.row]
    let personViewController:InfoViewController = segue.destination as! InfoViewController
    personViewController._person = selectedPerson
    }

    }
    }
    }
    }

    et j'ai comme info sur le terminal :



    SearchTableView[6339:82452] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want.
    Try this:
    (1) look at each constraint and try to figure out which you don't expect;
    (2) find the code that added the unwanted constraint or constraints and fix it.
    (
    "<NSLayoutConstraint:0x61000008f780 UIImageView:0x7ffdaf00ea10.width == 89 (active)>",
    "<NSLayoutConstraint:0x608000091580 UILabel:0x7ffdad711ad0'toto'.width == 262 (active)>",
    "<NSLayoutConstraint:0x608000091620 H:|-(8)-[UIImageView:0x7ffdaf00ea10] (active, names: '|':UITableViewCellContentView:0x7ffdad701200 )>",
    "<NSLayoutConstraint:0x608000091850 H:[UIImageView:0x7ffdaf00ea10]-(8)-[UILabel:0x7ffdad711ad0'toto'] (active)>",
    "<NSLayoutConstraint:0x6080000918a0 UILabel:0x7ffdad711ad0'toto'.trailing == UITableViewCellContentView:0x7ffdad701200.trailingMargin (active)>",
    "<NSLayoutConstraint:0x61000008ff50 'UIView-Encapsulated-Layout-Width' UITableViewCellContentView:0x7ffdad701200.width == 414 (active)>"
    )

    Will attempt to recover by breaking constraint
    <NSLayoutConstraint:0x608000091580 UILabel:0x7ffdad711ad0'toto'.width == 262 (active)>

    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
    The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
    2017-01-16 11:12:33.753393 SearchTableView[6339:82452] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want.
    Try this:
    (1) look at each constraint and try to figure out which you don't expect;
    (2) find the code that added the unwanted constraint or constraints and fix it.
    (
    "<NSLayoutConstraint:0x61000008fc30 UIImageView:0x7ffdaf00ea10.height == 89 (active)>",
    "<NSLayoutConstraint:0x608000091710 V:|-(22)-[UIImageView:0x7ffdaf00ea10] (active, names: '|':UITableViewCellContentView:0x7ffdad701200 )>",
    "<NSLayoutConstraint:0x608000091800 V:[UIImageView:0x7ffdaf00ea10]-(132)-| (active, names: '|':UITableViewCellContentView:0x7ffdad701200 )>",
    "<NSLayoutConstraint:0x61000008ffa0 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7ffdad701200.height == 342.667 (active)>"
    )

    Will attempt to recover by breaking constraint
    <NSLayoutConstraint:0x61000008fc30 UIImageView:0x7ffdaf00ea10.height == 89 (active)>

    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
    The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
    2017-01-16 11:12:33.753992 SearchTableView[6339:82452] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want.
    Try this:
    (1) look at each constraint and try to figure out which you don't expect;
    (2) find the code that added the unwanted constraint or constraints and fix it.
    (
    "<NSLayoutConstraint:0x61000008faf0 UILabel:0x7ffdaf00f3d0'_____'.width == 68 (active)>",
    "<NSLayoutConstraint:0x608000091bc0 H:[UILabel:0x7ffdaf00f3d0'_____']-(55)-| (active, names: '|':UITableViewCellContentView:0x7ffdad701200 )>",
    "<NSLayoutConstraint:0x608000091cb0 H:|-(252)-[UILabel:0x7ffdaf00f3d0'_____'] (active, names: '|':UITableViewCellContentView:0x7ffdad701200 )>",
    "<NSLayoutConstraint:0x61000008ff50 'UIView-Encapsulated-Layout-Width' UITableViewCellContentView:0x7ffdad701200.width == 414 (active)>"
    )

    Will attempt to recover by breaking constraint
    <NSLayoutConstraint:0x61000008faf0 UILabel:0x7ffdaf00f3d0'_____'.width == 68 (active)>

    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
    The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
    2017-01-16 11:12:33.754626 SearchTableView[6339:82452] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want.
    Try this:
    (1) look at each constraint and try to figure out which you don't expect;
    (2) find the code that added the unwanted constraint or constraints and fix it.
    (
    "<NSLayoutConstraint:0x61000008f780 UIImageView:0x7ffdaf00ea10.width == 89 (active)>",
    "<NSLayoutConstraint:0x61000008f7d0 UIImageView:0x7ffdaf00ebf0.width == 113 (active)>",
    "<NSLayoutConstraint:0x61000008f820 UILabel:0x7ffdaf00edd0.width == 117 (active)>",
    "<NSLayoutConstraint:0x608000091620 H:|-(8)-[UIImageView:0x7ffdaf00ea10] (active, names: '|':UITableViewCellContentView:0x7ffdad701200 )>",
    "<NSLayoutConstraint:0x608000091990 H:[UIImageView:0x7ffdaf00ea10]-(8)-[UILabel:0x7ffdaf00edd0] (active)>",
    "<NSLayoutConstraint:0x608000091a80 H:[UILabel:0x7ffdaf00edd0]-(8)-[UIImageView:0x7ffdaf00ebf0] (active)>",
    "<NSLayoutConstraint:0x608000091ad0 H:[UIImageView:0x7ffdaf00ebf0]-(32)-| (active, names: '|':UITableViewCellContentView:0x7ffdad701200 )>",
    "<NSLayoutConstraint:0x61000008ff50 'UIView-Encapsulated-Layout-Width' UITableViewCellContentView:0x7ffdad701200.width == 414 (active)>"
    )

    Will attempt to recover by breaking constraint
    <NSLayoutConstraint:0x61000008f820 UILabel:0x7ffdaf00edd0.width == 117 (active)>

    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
    The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
    2017-01-16 11:12:33.755441 SearchTableView[6339:82452] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want.
    Try this:
    (1) look at each constraint and try to figure out which you don't expect;
    (2) find the code that added the unwanted constraint or constraints and fix it.
    (
    "<NSLayoutConstraint:0x61000008f6e0 UIImageView:0x7ffdaf00ebf0.height == 31 (active)>",
    "<NSLayoutConstraint:0x61000008fa50 UILabel:0x7ffdaf00f3d0'_____'.height == 50 (active)>",
    "<NSLayoutConstraint:0x608000091530 UILabel:0x7ffdad711ad0'toto'.height == 39 (active)>",
    "<NSLayoutConstraint:0x6080000918f0 UILabel:0x7ffdad711ad0'toto'.top == UITableViewCellContentView:0x7ffdad701200.topMargin + 14 (active)>",
    "<NSLayoutConstraint:0x608000091a30 V:[UILabel:0x7ffdad711ad0'toto']-(19)-[UIImageView:0x7ffdaf00ebf0] (active)>",
    "<NSLayoutConstraint:0x608000091b70 V:[UILabel:0x7ffdaf00f3d0'_____']-(75)-| (active, names: '|':UITableViewCellContentView:0x7ffdad701200 )>",
    "<NSLayoutConstraint:0x608000091c10 V:[UIImageView:0x7ffdaf00ebf0]-(7)-[UILabel:0x7ffdaf00f3d0'_____'] (active)>",
    "<NSLayoutConstraint:0x61000008ffa0 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7ffdad701200.height == 342.667 (active)>"
    )

    Will attempt to recover by breaking constraint
    <NSLayoutConstraint:0x61000008fa50 UILabel:0x7ffdaf00f3d0'_____'.height == 50 (active)>

    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
    The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
    2017-01-16 11:12:33.756073 SearchTableView[6339:82452] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want.
    Try this:
    (1) look at each constraint and try to figure out which you don't expect;
    (2) find the code that added the unwanted constraint or constraints and fix it.
    (
    "<NSLayoutConstraint:0x61000008f8c0 UILabel:0x7ffdaf00edd0.height == 30 (active)>",
    "<NSLayoutConstraint:0x608000091530 UILabel:0x7ffdad711ad0'toto'.height == 39 (active)>",
    "<NSLayoutConstraint:0x6080000918f0 UILabel:0x7ffdad711ad0'toto'.top == UITableViewCellContentView:0x7ffdad701200.topMargin + 14 (active)>",
    "<NSLayoutConstraint:0x608000091940 V:[UILabel:0x7ffdaf00edd0]-(133)-| (active, names: '|':UITableViewCellContentView:0x7ffdad701200 )>",
    "<NSLayoutConstraint:0x6080000919e0 V:[UILabel:0x7ffdad711ad0'toto']-(19)-[UILabel:0x7ffdaf00edd0] (active)>",
    "<NSLayoutConstraint:0x61000008ffa0 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7ffdad701200.height == 342.667 (active)>"
    )

    Will attempt to recover by breaking constraint
    <NSLayoutConstraint:0x608000091530 UILabel:0x7ffdad711ad0'toto'.height == 39 (active)>

    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
    The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 

    Je ne comprend pas pouvez-vous m'aider.


     


    Merci,

  • LeChatNoirLeChatNoir Membre, Modérateur

    ben ça, c'est des problèmes d'auto-Layout. Tu as des contraintes qui se contrarient. Mais ce' ne sont que des warnings car le système s'en accomode et fais péter certaines contraintes automatiquement.


     


    Il faut revoir tes contraintes dans le viewController de ton storyboard


  • Bonsoir tous le monde,


    


    J'ai modifier mon code au complet et ça fonctionne très bien, jute quelque erreurs.

    


    quant tous sera OK je mettrais mon code pour aider les autres.

    


    Quant j'écris un text de type une chaine de caractère pas de problème mais deux chaine de caractère comme cela "aix en provence" sa donne cela "aixenprovence" comment je peux régler cela.

    


    Pour mon deuxième problème j'utilise ID_produit  pour créer une vue détailler, mais quant je clique sur le mon de mon produit, il récupère un mauvais ID_produit.

    




    1976 //nom id_produit
    Optional("produit1")
    Optional("PARIS")
    5911//nom id_produit
    Optional("produit2")
    Optional("NICE")
    4892//nom id_produit
    Optional("produit3")
    Optional("NICE")
    3019//nom id_produit
    Optional("produit4")
    Optional("NICE")

    et quant le clique sur produit1 il me donne l'ID-produit du produit4, qui donne 3019 je resultat est faux c'est 1976.

    


    voilà  mon code

    




    import UIKit
    import SwiftyJSON

    class SearchResultsTableViewController: UITableViewController {

    var TabInfos = [String]()
    var idTextLabel: UILabel!

    var searchResults = [JSON]() {
    didSet {
    tableView.reloadData()
    }
    }

    var validatedText: String {
    return searchController.searchBar.text!.replacingOccurrences(of: " ", with: "").lowercased()
    }

    let searchController = UISearchController(searchResultsController: nil)
    let requestManager = RequestManager()

    override func viewDidLoad() {
    super.viewDidLoad()

    searchController.searchBar.delegate = self
    searchController.dimsBackgroundDuringPresentation = false
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.searchBar.placeholder = "Search ..."
    definesPresentationContext = true
    tableView.tableHeaderView = searchController.searchBar
    searchController.searchBar.delegate = self
    searchController.searchBar.sizeToFit()

    NotificationCenter.default.addObserver(self, selector: #selector(SearchResultsTableViewController.updateSearchResults), name: NSNotification.Name(rawValue: "searchResultsUpdated"), object: nil)

    self.clearsSelectionOnViewWillAppear = false

    }

    func updateSearchResults() {
    searchResults = requestManager.searchResults
    }

    override func numberOfSections(in tableView: UITableView) -> Int {

    return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return searchResults.count
    }

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

    cell.textLabel?.text = searchResults[indexPath.row]["produit"].stringValue
    cell.detailTextLabel?.text = searchResults[indexPath.row]["ville"].stringValue

    let idTextLabel = searchResults[indexPath.row]["id_produit"].stringValue

    print(idTextLabel)

    TabInfos = [idTextLabel]

    print(idTextLabel)
    print(cell.textLabel?.text as Any)
    print(cell.detailTextLabel?.text as Any)

    if indexPath.row == searchResults.count - 0 {
    if requestManager.hasMore {
    requestManager.getNextPage(validatedText)
    }
    }

    return cell
    }

    deinit {
    NotificationCenter.default.removeObserver(self)
    }

    }

    extension SearchResultsTableViewController: UISearchBarDelegate {
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {

    requestManager.resetSearch()
    updateSearchResults()
    requestManager.search(validatedText)
    }

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

    switch segue.identifier! {
    case "showDetail":

    let svc = segue.destination as! UINavigationController
    let addEventViewController = svc.topViewController as! InfoSearchTableViewController
    addEventViewController.TabInfos = TabInfos

    default:
    print(segue.identifier!)
    break
    }
    }

    }

    Merci de votre aide,



  • Pour mon deuxième problème j'utilise ID_produit  pour créer une vue détailler, mais quant je clique sur le mon de mon produit, il récupère un mauvais ID_produit.

    Tu te sers de TabInfos pour savoir quel item envoyer à  ton next view controller. Or tu écris TabInfos = [idTextLabel] dans cellForRowAtIndexPath, et non pas dans didSelectItemAtIndexPath: ! Donc commence par implémenter didSelectItemAtIndexPath:.

  • InsouInsou Membre
    janvier 2017 modifié #27

    Regarde ce tuto : 



    Il te montre qu'il faut prendre l'Id de ta liste "filtrée", là  il prend l'id de ta liste "normale", du coup, tu tombe pas sur le bon produit.


    En gros il faut que tu regarde si tu es dans ta barre de recherche (si elle est active et non nulle) et prendre l'id à  ce moment là .


    Ce tuto te montre exactement comment faire :)


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