2016-12-21 41 views
-1

我的問題是我在Swift 3中實現了UISearchController當我試圖過濾它很容易過濾的簡單數組,但我的情況有點不同我有一個數組,我從類中獲取所有數據從SQLite database所以它的數組類UISearchController updateSearchResults問題

managerControlClassArray它具有類數組的所有內容。

我想篩選updateSearchResults委託方法中的內容,但它確實很難並且卡住了我對很多研究做了很多研究,但沒有得到我想要的查詢後,我發現StackOverflow非常有用,並且如果有人幫助我,我會很感激。

一些代碼邏輯:

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

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

class Manager: NSObject{ 

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

} 

謝謝。

再見。

+0

那麼你是如何篩選的數組,你能發佈一些代碼?此外,按類你是否使用數組中包含的自定義對象? –

+0

已添加codelogic –

+0

您是如何過濾簡單數組的,您是否也可以添加代碼? –

回答

1

我們可以用Swift的filter方法嗎?

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() 
} 

編輯

更新了答案,最新的斯威夫特3語法

+0

嗨感謝您的答案,這是非常接近的謝謝你幫助我只是最後一個問題,因爲我得到一個錯誤「價值的類型'字符串'沒有成員'rangeOfString'」 –

+0

請讓我知道我會接受的答案 –

+0

,我只想通過標題搜索在uper和小寫 –