2017-10-20 20 views
0

enter image description hereenter image description hereenter image description hereenter image description here J'essaye de créer une application de type de dictionnaire avec l'en-tête de section, le texte de titre, et le texte de sous-titre. J'ai réussi à tout faire fonctionner en utilisant le code suivant. La seule chose que je n'arrive pas à comprendre est comment filtrer l'UISearchBar pour montrer les résultats de la chaîne [Coptic] dans le tableau. Est-ce possible même de la façon dont j'ai organisé tout ou dois-je restructurer? Est-ce que quelqu'un a des suggestions?UISearchBar d'une chaîne dans un tableau

J'ai laissé le code pour le updateSearchResults vide en bas parce que je ne sais pas quoi coder.

class Gamma: UITableViewController, UISearchBarDelegate, UISearchResultsUpdating { 


    struct words { 

     var sectionName : String! 
     var coptic : [String]! 
     var english : [String]! 
    } 

    var array = [words]() 
    var filtered = [words]() 
    var filtered2 = UITableViewController() 

    var indexarray = ["Ga", "Ge", "Gy", "Gn", "Go", "Gr", "Gw"] 

    let searchController = UISearchController(searchResultsController: nil) 




    override func viewDidLoad() { 
     super.viewDidLoad() 


     let defaultTextAttribs = [NSAttributedStringKey.font.rawValue: UIFont(name:"CS Avva Shenouda", size:17), NSAttributedStringKey.foregroundColor.rawValue:UIColor.black] 


     UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = defaultTextAttribs as Any as! [String : Any] 


     self.navigationController?.navigationBar.tintColor = UIColor.white 

     filtered = array 

     searchController.searchResultsUpdater = self 
     searchController.hidesNavigationBarDuringPresentation = false 
     searchController.dimsBackgroundDuringPresentation = false 


     self.navigationItem.titleView = searchController.searchBar 

     tableView.rowHeight = UITableViewAutomaticDimension 
     tableView.estimatedRowHeight = 400 
     tableView.sectionHeaderHeight = 40 
     tableView.sectionIndexBackgroundColor = UIColor.clear 
     tableView.sectionIndexMinimumDisplayRowCount = 15 


     array = [words(sectionName: "Ga", coptic: ["Gabriyl", "gaza", "gazovulakion", "gala", "galynyc", "Galile`a", "galileoc", "gamoc", "gar"], english: ["ghabriyēl\n\n(Heb.) - Gabriel", "ghå`zå\n\n(f.) - Treasure, money chest", "ghåzo`filåk`yon\n\n(Gk.) - Treasury", "ghå`lå\n\n(Gk. m.) - Milk", "ghålēnēs\n\n(Gk. f.) - Gentle, calm", "ghålilā`å\n\nGalilee", "ghålilā`os\n\n(adj.) - Galilean", "ghåmos/gåmos\n\n(Gk. m.) - Wedding, marriage", "ghår\n\n(Gk. conj.) - For, because"]), 
     words(sectionName: "Ge", coptic: ["geenna", "gene`a", "genecic", "genneoc", "gennyma", "gennycic", "gennytyc", "gennytria", "genoc", "Gewrgioc"], english: ["ge`ā`nå\n\n(Heb.) - Gehenna, Hades", "gene`å\n\n1. (Gk. f.) - Generation\n\n2. (Gk. f.) - New, recent", "genesis\n\n(Gk. f.) - Birth, start, inception", "gennā`os\n\n(Gk. adj.) - Brave, noble, honorable, good", "gennē`må\n\n(Gk. m.) - Offspring, product", "gennē`sis\n\n(Gk. f.) - Birth, generation", "gennē`tēs\n\n(Gk. m.) - Parent, generator", "gennēt`riyā\n\n(Gk. f.) - Parent, generator", "gā`nos\n\n(Gk. m.) - Race, tribe", "ge`ōrgi`yos\n\nGeorge"]), 
       words(sectionName: "Gy", coptic: ["gy"], english: ["gē\n\n(Gk. f.) - Earth, ground, land"]), 
       words(sectionName: "Gn", coptic: ["gnovoc", "gnwmy", "gnwcic"], english: ["ghno`fos\n\n(Gk. m.) - Darkness, gloom", "ghnō`mē\n\n(Gk. f.) - Opinion, thought, judgement", "ghnō`sis\n\n(Gk. f.) - Knowledge"]), 
       words(sectionName: "Go", coptic: ["Golgo;a", "Gomorra", "gonato"], english: ["gholghothå\n\n(Heb. f.) - Calvary, Golgotha", "ghomorrå\n\n(Heb.) - Gomorrah", "ghonå`to\n\n(Gk.) - Knee"]), 
       words(sectionName: "Gr", coptic: ["grammateuc", "grammatiky", "gravy"], english: ["gråmmå`tevs\n\n(Gk. m.) - Scribe, secretary", "gråmmå`tikē\n\n(Gk. f.) - Grammar", "ghrå`fē\n\n(Gk. f.) - Writing, drawing, book"]), 
       words(sectionName: "Gw", coptic: ["Gwg"], english: ["gōg\n\nGog"]), 

     ] 


    } 

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

    // MARK: - Table view data source 

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

     cell?.textLabel?.text = array[indexPath.section].coptic[indexPath.row] 
     cell?.detailTextLabel?.text = array[indexPath.section].english[indexPath.row] 
     cell?.textLabel?.font = UIFont(name:"CS Avva Shenouda", size:30) 
     cell?.detailTextLabel?.font = UIFont(name: "Constantia", size:25) 
     cell?.textLabel?.numberOfLines = 0 
     cell?.detailTextLabel?.numberOfLines = 0 
     cell?.textLabel?.textColor = UIColor.black 
     cell?.detailTextLabel?.textColor = UIColor.darkGray 

     return cell! 
    } 


    override func numberOfSections(in tableView: UITableView) -> Int { 
     return array.count 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return array[section].coptic.count 

    } 

    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
     return array[section].sectionName 

    } 

    override func sectionIndexTitles(for tableView: UITableView) -> [String]? { 
     return indexarray 
    } 

    override var preferredStatusBarStyle: UIStatusBarStyle { 
     return .lightContent 
    } 

    override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) 
    { 
     let header = view as! UITableViewHeaderFooterView 
     header.textLabel?.font = UIFont(name: "CS Avva Shenouda", size: 25)! 
     header.textLabel?.textColor = UIColor.black 
     header.backgroundView?.backgroundColor = UIColor.lightGray 

    } 

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     print("Row \(indexPath.row) selected") 
    } 

    func updateSearchResults(for searchController: UISearchController) { 
     if searchController.searchBar.text! == "" { 


     } else { 


     } 

    } 


} 
+1

exactement ce que vous voulez poster capture d'écran du résultat filtré. (comme vous avez déclaré tableau filtré mais pas utilisé dans tableview) –

+1

supposons que je tape "gal" quelle est la sortie –

+1

okey même si j'ai ajouté la solution espère que cela fonctionne pour vous .. –

Répondre

1

J'essaie de comprendre votre problème espère que vous voulez le code suivant pour obtenir une sortie

enter image description here

// 
// ViewController.swift 
// Testing 
// 
// Created by Jaydeep on 28/10/17. 


    import UIKit 

    class Gamma: UITableViewController, UISearchBarDelegate, UISearchResultsUpdating,UISearchControllerDelegate { 


     struct words { 

      var coptic : [String]! 
      var english : [String]! 
     } 

     var array = [words]() 
     var filtered = [words]() 
     var filtered2 = UITableViewController() 



     let searchController = UISearchController(searchResultsController: nil) 




     override func viewDidLoad() { 
      super.viewDidLoad() 


      let defaultTextAttribs = [NSAttributedStringKey.font.rawValue: UIFont.systemFont(ofSize: 17), NSAttributedStringKey.foregroundColor.rawValue:UIColor.black] 


      UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = defaultTextAttribs as Any as! [String : Any] 


      self.navigationController?.navigationBar.tintColor = UIColor.white 


      searchController.searchBar.delegate = self 
      searchController.searchResultsUpdater = self 
      searchController.hidesNavigationBarDuringPresentation = false 
      searchController.dimsBackgroundDuringPresentation = false 
      searchController.delegate = self 

      self.navigationItem.titleView = searchController.searchBar 

      tableView.rowHeight = UITableViewAutomaticDimension 
      tableView.estimatedRowHeight = 400 
      tableView.sectionHeaderHeight = 40 
      tableView.sectionIndexBackgroundColor = UIColor.clear 
      tableView.sectionIndexMinimumDisplayRowCount = 15 


      array = [words(coptic: ["Gabriyl", "gaza", "gazovulakion", "gala", "galynyc", "Galile`a", "galileoc", "gamoc", "gar"], english: 
       ["ghabriyēl \n\n(Heb.) - Gabriel", "ghå`zå\n\n(f.) - Treasure,money chest", "ghåzo`filåk`yon\n\n(Gk.) - Treasury", "ghå`lå\n\n(Gk. m.) - Milk", "ghålēnēs\n\n(Gk. f.) - Gentle, calm", "ghålilā`å\n\nGalilee", "ghålilā`os\n\n(adj.) - Galilean", "ghåmos/gåmos\n\n(Gk. m.) - Wedding, marriage", "ghår\n\n(Gk. conj.) - For, because"]), 
        words(coptic: ["geenna", "gene`a", "genecic", "genneoc", "gennyma", "gennycic", "gennytyc", "gennytria", "genoc", "Gewrgioc"], english: ["ge`ā`nå\n\n(Heb.) - Gehenna, Hades", "gene`å\n\n1. (Gk. f.) - Generation\n\n2. (Gk. f.) - New, recent", "genesis\n\n(Gk. f.) - Birth, start, inception", "gennā`os\n\n(Gk. adj.) - Brave, noble, honorable, good", "gennē`må\n\n(Gk. m.) - Offspring, product", "gennē`sis\n\n(Gk. f.) - Birth, generation", "gennē`tēs\n\n(Gk. m.) - Parent, generator", "gennēt`riyā\n\n(Gk. f.) - Parent, generator", "gā`nos\n\n(Gk. m.) - Race, tribe", "ge`ōrgi`yos\n\nGeorge"]), 
        words(coptic: ["gy"], english: ["gē\n\n(Gk. f.) - Earth, ground, land"]), 
        words(coptic: ["gnovoc", "gnwmy", "gnwcic"], english: ["ghno`fos\n\n(Gk. m.) - Darkness, gloom", "ghnō`mē\n\n(Gk. f.) - Opinion, thought, judgement", "ghnō`sis\n\n(Gk. f.) - Knowledge"]), 
        words(coptic: ["Golgo;a", "Gomorra", "gonato"], english: ["gholghothå\n\n(Heb. f.) - Calvary, Golgotha", "ghomorrå\n\n(Heb.) - Gomorrah", "ghonå`to\n\n(Gk.) - Knee"]), 
        words(coptic: ["grammateuc", "grammatiky", "gravy"], english: ["gråmmå`tevs\n\n(Gk. m.) - Scribe, secretary", "gråmmå`tikē\n\n(Gk. f.) - Grammar", "ghrå`fē\n\n(Gk. f.) - Writing, drawing, book"]), 
        words(coptic: ["Gwg"], english: ["gōg\n\nGog"]), 

      ] 
      filtered = array 


     } 
     func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { 
      searchBar.text = "" 
      // Hide the cancel button 
      searchBar.showsCancelButton = false 
      filtered = array 
      tableView.reloadData() 
     } 
     override func didReceiveMemoryWarning() { 
      super.didReceiveMemoryWarning() 
      // Dispose of any resources that can be recreated. 
     } 

     // MARK: - Table view data source 
    override func numberOfSections(in tableView: UITableView) -> Int { 
    if filtered.count > 0 

    { 
     return filtered.count 
    } 
    else 
    { 
     return 0 
    } 
} 
     override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
      let cellIdentifier = "cell" 
      var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) 
      if cell == nil 
      { 
       cell = UITableViewCell(style: UITableViewCellStyle.value2, reuseIdentifier: cellIdentifier) 
      } 
      cell?.textLabel?.text = filtered[indexPath.section].coptic[indexPath.row] 
      cell?.detailTextLabel?.text = filtered[indexPath.section].english[indexPath.row] 
      cell?.textLabel?.font = UIFont.systemFont(ofSize: 20) 
      cell?.detailTextLabel?.font = UIFont.systemFont(ofSize: 15) 
      cell?.textLabel?.numberOfLines = 0 
      cell?.detailTextLabel?.numberOfLines = 0 
      cell?.textLabel?.textColor = UIColor.black 
      cell?.detailTextLabel?.textColor = UIColor.darkGray 

      return cell! 
     } 

     override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
      return UITableViewAutomaticDimension 
     } 


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

      if filtered.count > 0 
      { 
       return filtered[section].coptic.count 
      } 
      else 
      { 
      return 0 
      } 
     } 

     override var preferredStatusBarStyle: UIStatusBarStyle { 
      return .lightContent 
     } 

     override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
      print("Row \(indexPath.row) selected") 
     } 

     func updateSearchResults(for searchController: UISearchController) { 
      // If we haven't typed anything into the search bar then do not filter the results 
      if searchController.searchBar.text! == "" 
      { 
       filtered = array 
      } 
      else 
      { 
       filtered.removeAll() 
       for i:Int in 0 ..< array.count 
        { 
         var copticArray:[String] = [] 
         var englishArray:[String] = [] 
         var tempWord:words = words.init(coptic: [], english: []) 


         let copticCount = array[i].coptic.count 
         for copticIndex:Int in 0 ..< copticCount 
         { 
          if array[i].coptic[copticIndex].lowercased().contains(searchController.searchBar.text!.lowercased()) 
          { 

           copticArray.append(array[i].coptic[copticIndex]) 
           englishArray.append(array[i].english[copticIndex]) 

          } 
         } 

         tempWord.coptic = copticArray 
         tempWord.english = englishArray 
         if (copticArray.count > 0) 
         { 
          self.filtered.append(tempWord) 
         } 
        } 
       tableView.reloadData() 

      } 
     } 


    } 
+0

Je l'ai eu à travailler. Merci beaucoup. Avez-vous par hasard savoir comment changer la police du tableau d'index? –

+0

Ok, donc ce code fonctionne réellement lorsque la cellule est définie sur personnalisée. Mais quand la cellule est configurée pour sous-titre, qui est le format que je veux, elle se bloque quand je cherche un mot. Toute raison pour laquelle cela arrive? –

+0

Pour être plus clair, je veux filtrer en utilisant la chaîne copte et l'afficher en tant que libellé de cellule, tout en affichant la chaîne anglaise correspondante dans l'étiquette detailtext. Est-ce possible? –