如何在 swift3 中使用 tableview 和 searchbarcontroller 创建范围搜索

Posted

技术标签:

【中文标题】如何在 swift3 中使用 tableview 和 searchbarcontroller 创建范围搜索【英文标题】:How to create a scope search using tableview and searchbarcontroller in swift3 【发布时间】:2017-07-08 11:57:50 【问题描述】:

大家好都设计了一个使用 tableview 和 serchbarcontroller 的范围搜索。为了实现这一点,使用了下面的代码,但不知何故它没有返回我的实际输出。希望得到帮助。谢谢。

输出:

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")



【问题讨论】:

抱歉,没有真正理解您的情况。您的意思是要使用您选择的单词作为自动完成文本字段的数据源? 自动补全的来源意味着我们提供给文本字段的值稍后将来自 API。例如github.com/apasccon/SearchTextField所有国家的名字都来自API。 那么您想通过选择学校、城市等数据源来生成自动完成字段吗? 是的,希望在点击搜索按钮时根据所有选定的值显示数据。 你现在卡在哪里了,能发一些代码吗? 【参考方案1】:

你可以这样试试吗:

    创建一个自动完成文本字段数组,每个数据源一个。 首先让这些文本字段不可见。 选择值并单击搜索按钮后,让相应的文本字段可见。

不确定是否满足您的要求,如有问题请离开cmets。

【讨论】:

感谢您的帮助。但是,如果您能帮助我,请参考我更新的问题。我已经更改了我的设计并使用当前的设计和代码更新了我的问题。

以上是关于如何在 swift3 中使用 tableview 和 searchbarcontroller 创建范围搜索的主要内容,如果未能解决你的问题,请参考以下文章

使用swift3在tableview中搜索栏和部分

TableView 使用 Swift 3 展开/折叠

Swift 3.0 TableView 单元格按钮

iOS:tableView.reloadData() 在 swift3 中不起作用

我想在 swift3 的 tableview 中插入行作为部分

如何在 Swift 3 中使用 JSON 填充 TableView