2017-07-08 41 views
1

大家好,都设计了一个使用tableview和serchbarcontroller的范围搜索。为了达到这个目的,使用了下面的代码,但不知怎的,它并没有返回实际输出。希望得到帮助。谢谢。如何使用tableview和searchbarcontroller在swift3中创建范围搜索

输出:

here is my output's ScreenShot

代码:

import UIKit 

class SearchBookVC: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating, UISearchBarDelegate { 

@IBOutlet weak var tableview: UITableView! 

struct Books { 
    var name = String() 
    var board = String() 
    var classname = String() 
    var area = String() 
    var city = String() 
    } 

    var books = [Books(name: "Physics", board: "CBSE",classname:"XI",area:"Karnataka",city:"Bangalore"), 
       Books(name:"English",board:"CBSE",classname:"X",area:"Maharashtra",city:"pune"), 
       Books(name:"biology",board:"IB",classname:"XII",area:"Gujarat",city:"Rajkot"), 

       Books(name:"chemistry",board:"IB",classname:"X",area:"Gujarat",city:"Ahmedabad"), 

       Books(name:"Maths",board:"ICSE",classname:"IX",area:"Maharashtra",city:"Mumbai"), 
       Books(name:"Science",board:"ICSE",classname:"XII",area:"Karnataka",city:"Mysore") 
       ] 
    var filteredBooks = [Books]() 

    let searchController = UISearchController(searchResultsController: nil) 



    override func viewDidLoad() { 
    super.viewDidLoad() 

     filteredBooks = books 

     searchController.searchResultsUpdater = self 
     searchController.dimsBackgroundDuringPresentation = false 
     definesPresentationContext = true 
     tableview.tableHeaderView = searchController.searchBar 

     searchController.searchBar.scopeButtonTitles = ["All","Name", "Board", "Class", "Area","City"] 

     searchController.searchBar.delegate = self 

     self.tableview.register(mycell.self, forCellReuseIdentifier: "cell") 


    // Do any additional setup after loading the view. 
} 

func applySearch(searchText: String, scope: String = "All") { 


    if searchController.searchBar.text! == "" 
    { 
     filteredBooks = books.filter { book in 
      let nameofbook = (scope == "All") || (book.name == scope) || (book.board == scope) || (book.classname == scope) || (book.area == scope) || (book.city == scope) 
      return nameofbook 
    } 
    } 
     else 
     { 
      filteredBooks = books.filter { book in 
       let nameofbook = (scope == "All") || (book.name == scope) || (book.board == scope) || (book.classname == scope) || (book.area == scope) || (book.city == scope) 
       return nameofbook && book.name.lowercased().contains(searchText.lowercased()) && book.board.lowercased().contains(searchText.lowercased()) && book.classname.lowercased().contains(searchText.lowercased()) && book.area.lowercased().contains(searchText.lowercased()) && book.city.lowercased().contains(searchText.lowercased()) 
      } 
     } 
    self.tableview.reloadData() 
} 
func updateSearchResults(for searchController: UISearchController) { 

    let searchBar = searchController.searchBar 
    let selectedScope = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex] 
    applySearch(searchText: searchController.searchBar.text!,scope: selectedScope) 
} 
func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) { 
    applySearch(searchText: searchController.searchBar.text!,scope: searchBar.scopeButtonTitles![selectedScope]) 
} 



func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.filteredBooks.count 
} 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! mycell 

    cell.bookname?.text = self.filteredBooks[indexPath.row].name 
    cell.Boardname?.text = self.filteredBooks[indexPath.row].board 
    cell.classtitle?.text = self.filteredBooks[indexPath.row].classname 

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

} 
+0

对不起,并没有真正了解你的情况。你的意思是你想使用你选择的文字作为自动完成文本字段的数据源吗? –

+0

自动完成的来源意味着我们提供给文本字段的值稍后将来自API。例如https://github.com/apasccon/SearchTextField国家的所有名称都将来自API。 – TheMiss

+0

所以你想通过选择数据源如学校,城市等来生成自动完成字段? –

回答

0

你可以试试这样:

  1. 制作自动完成文本的数组领域,一个用于每个数据源。
  2. 首先让这些文本字段不可见。
  3. 选择值并单击搜索按钮后,让相应的文本字段可见。

不确定它是否能满足您的要求,如果您有任何问题,请留下评论。

+0

感谢您的帮助。但请参阅我更新的问题,如果你能帮助我out.I改变了我的设计和更新我的问题与当前的设计和代码。 – TheMiss

+0

@TheMiss哪里调用updateSearchResults'''? –