dictionnaire et UISearchController

Bonsoir à  tous


 


J'ai besoin de filtrer dans un tableView le contenu d'un dictionnaire.


Les exemples sur le net sont toujours basé sur un tableau comme cela :



func updateSearchResultsForSearchController(searchController: UISearchController)
{
filteredTableData.removeAll(keepCapacity: false)

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

self.tableView.reloadData()
}

Est-il possible d'adapter ce code pour un dictionnaire ou je fais fausse route ?


 


Merci


Réponses

  • Tu peux filtrer ton dico comme ça :



    var data = ["a":"Test", "b":"nope"]
    for (key, value) in data {
    if value != "Test" {
    data.removeValueForKey(key)
    }
    }
  • Tu peux utiliser le NSPredicate pour filtrer un NS(Mutable)Array de NS(Mutable)Dictionary.


    Par contre, il faudrait connaà®tre les clés et les valeurs sur lesquelles tu veux filtrer.


    Après, le NSPredicate est très "CocoaTouch" (avec une notion d'Objective-C). Swift préfère les filters et les flatmap/map et ses $0 qu'on voit parfois via .filter{}


  • macphimacphi Membre
    août 2016 modifié #4

    Merci pour vos réponses mais pour l'instant je n'y arrive pas...


     


    Je cherche je cherche !


     


    Voilà  le code à  l'instant (j'ai beaucoup trituré...)



    import UIKit
    import AVFoundation

    class TableViewController: UITableViewController, UISearchResultsUpdating {

    @IBOutlet var tblView: UITableView!

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

    let speechSynthesizer = AVSpeechSynthesizer()

    var mots = [

    ["motAnglais" : "to cancel", "motFrancais": "annuler"],
    ["motAnglais" : "the earth", "motFrancais": "la terre"],
    ["motAnglais" : "a world", "motFrancais": "un monde"],
    ["motAnglais" : "always", "motFrancais": "toujours"],
    ["motAnglais" : "a kite", "motFrancais": "un cerf-volant"]

    ]

    override func viewDidLoad() {
    super.viewDidLoad()

    tableView.contentInset = UIEdgeInsets(top: 18, left: 0, bottom: 0, right: 0)

    super.viewDidLoad()

    tblView.delegate = self
    tblView.dataSource = self
    self.resultSearchController = ({
    let controller = UISearchController(searchResultsController: nil)
    controller.searchResultsUpdater = self
    controller.dimsBackgroundDuringPresentation = false
    controller.searchBar.sizeToFit()
    self.tblView.tableHeaderView = controller.searchBar
    return controller
    })()

    self.tblView.reloadData()


    }

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

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

    if self.resultSearchController.isActive {
    return self.filteredTableData.count
    }else{
    return self.mots.count
    }

    }

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


    let mot = mots[indexPath.row]

    let cell = tableView.dequeueReusableCell( withIdentifier: "listItem", for: indexPath)

    let label = cell.viewWithTag(1000) as! UILabel
    let label2 = cell.viewWithTag(1001) as! UILabel

    if self.resultSearchController.isActive {
    cell.textLabel?.text = filteredTableData[indexPath.row]
    } else {
    label.text = mot["motAnglais"]
    label2.text = mot["motFrancais"]
    }
    return cell

    }

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


    func updateSearchResults(for: UISearchController) {

    filteredTableData.removeAll(keepingCapacity: false)
    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", resultSearchController.searchBar.text!)

    let array = (mots as NSArray).filtered(using: searchPredicate)
    filteredTableData = array as! [String]
    self.tblView.reloadData()
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    var voiceToUseAgain: AVSpeechSynthesisVoice?

    voiceToUseAgain = AVSpeechSynthesisVoice(identifier: AVSpeechSynthesisVoiceIdentifierAlex)

    let mot = mots[indexPath.row]

    let speechUtterance = AVSpeechUtterance(string: mot["motAnglais"]!)
    speechUtterance.voice = voiceToUseAgain
    speechSynthesizer.speak(speechUtterance)
    }

    }


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