UISearchController updateSearchResults问题 [英] UISearchController updateSearchResults issue

查看:432
本文介绍了UISearchController updateSearchResults问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题是我在Swift 3中实现了 UISearchController ,当我试图过滤它时,它很容易被过滤的简单数组但我的情况有点不同我有一个数组,我取了类中的所有数据来自 SQLite数据库,因此它的数组类

My question is I have implemented UISearchController in Swift 3 when I tried to filter it's easily filtered simple array but my case is little bit different I have one array which I fetch all the data from SQLite database in class so its array of class

managerControlClassArray 其中包含类数组的所有内容。

managerControlClassArray which has all the content of the class array.

我想过滤中的内容updateSearchResults 委托方法,但它真的很困难,我做了很多研究,在没有得到我想要的查询后,我发现StackOverflow非常有用,并质疑如果有人帮助我,我将不胜感激。

I want to filter the content in updateSearchResults delegate method but it's really difficult and stuck I did to much research and after not getting my desired query I found StackOverflow is very useful and question it if someone help's me, I would be grateful.

一些代码逻辑:

manager = ModelManager.getInstance().getAllManager()
// I get all the objects using singleton

//manager class has following data
id, title, designation, salary

//In TableView i want to display data by using that

let managerVar = manager[indexPath.row]
cell.textLabel.text = managerVar.title

修改:

MasterTableViewController.swift

MasterTableViewController.swift

import UIKit

class MasterTableViewController: UITableViewController, UISplitViewControllerDelegate, UISearchResultsUpdating {

      var array: NSMutableArray! = NSMutableArray()

      var managerArray = [foodManager]()

      var filteredmanagerArray = [foodManager]()
      var searchController = UISearchController(searchResultsController: nil)


  override func viewDidLoad() {
      super.viewDidLoad()

      // Set the AppTitle using Config File
      self.title = GL_Appname

      managerArray = ModelManager.getInstance().getAllManagers()

      filteredmanagerArray = managerArray

      //copyTitleArrayForSearch()

      self.tableView.reloadData()

      self.splitViewController!.delegate = self;
      self.splitViewController!.preferredDisplayMode = UISplitViewControllerDisplayMode.allVisible

      //Seach Result Controller
      self.searchController.searchResultsUpdater = self
      self.searchController.dimsBackgroundDuringPresentation = false
      self.searchController.definesPresentationContext = true
      self.searchController.searchBar.sizeToFit()
      self.tableView.tableHeaderView = self.searchController.searchBar


  }



  /* func copyTitleArrayForSearch(){

        for i in 0..<managerArray.count{
            let fd = managerArray[i]

            //titleArray.append(fd.title)
        }

    } */

  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 {
      return 1
  }

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

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

      if searchController.isActive{
          return filteredmanagerArray.count
      }
      else{
          return managerArray.count
      }
  }

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

      cell.textLabel?.adjustsFontSizeToFitWidth = true
      cell.textLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping
      cell.textLabel?.numberOfLines = 3

      cell.textLabel?.textColor = UIColor.black
      cell.textLabel?.font = UIFont(name: "ChalkboardSE-Light", size: 14.0)

      if searchController.isActive {
          let fra = filteredmanagerArray[indexPath.row]
          cell.textLabel?.text = fra.title.uppercased()
      }
      else{
          let fd = managerArray[indexPath.row]
          cell.textLabel?.text = fd.title.uppercased()
      }

      return cell
  }

  func updateSearchResults(for searchController: UISearchController) {
      self.tableView.reloadData()

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

      let array = (self.filteredRecipeArray as NSArray).filtered(using: searchPredicate)

      self.filteredRecipeArray = array as! [foodRecipe]

      self.tableView.reloadData()
  }


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

      print("DidSelect index Path: \(indexPath.row)")
      //print("Filtered Manager Index: \(filteredmanagerArray[indexPath.row]))")

      self.performSegue(withIdentifier: "showDetail", sender: self)

  }

  // MARK: - Navigation

  // In a storyboard-based application, you will often want to do a little preparation before navigation
  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

      if segue.identifier == "showDetail" {

          let index = self.tableView.indexPathForSelectedRow! as IndexPath

          let nav = segue.destination as! UINavigationController

          let vc = nav.viewControllers[0] as! DetailViewController

          if searchController.isActive {

              print("Manager Array Index: \(managerArray[index.row])")

              //var currentFilteredIndex = filteredmanagerArray[(indexPath as NSIndexPath).row]
              print("Filtered Manager Array Index: \(filteredmanagerArray[index.row])" 
          }
          else{
              vc.selectedmanagerArray = [managerArray[index.row]]

          }

          //vc.titleText = self.array.object(at: (index as NSIndexPath).row) as! String
          self.tableView.deselectRow(at: index, animated: true)

      }

  }

  // MARK: - UISplitViewControllerDelegate

  func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {

      return true

  }
}

Manager.swift

Manager.swift

class Manager: NSObject{

    var id: String = String()
    var title: String = String()
    var ManagerDesignation: String = String()

}

谢谢。

再见。

推荐答案

<我们可以使用Swift内置的过滤器方法吗?

func updateSearchResults(for searchController: UISearchController) {
  self.tableView.reloadData()

  self.filteredRecipeArray.removeAll(keepingCapacity: false)
  guard let searchText = searchController.searchBar.text else {
      return
  }

  let array = managerArray.filter {
      return $0.id.range(of: searchText) != nil ||
             $0.title .range(of: searchText) != nil ||
             $0.ManagerDesignation.range(of: searchText) != nil
  }

  self.filteredRecipeArray = array

  self.tableView.reloadData()
}

编辑

更新了最新的Swift 3语法

Updated the answer to latest Swift 3 syntax

这篇关于UISearchController updateSearchResults问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆