实现搜索栏以使用自定义单元格进行tableview

时间:2019-07-05 08:56:53

标签: ios swift uitableview tableview searchbar

我创建了一个带有自定义单元格的表格视图,现在正在努力添加搜索栏。

import UIKit

class ViewController: UIViewController, UITableViewDataSource {

var SVGdata = [SVG]()

override func viewDidLoad() {
    super.viewDidLoad()

}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    createSVGdata()
}

// Create movies data
func createSVGdata() {
    SVGdata.append(SVG(SVGArtikel: "Art. 1", SVGGesetzestext: "Das darfst du nicht tun"))
    SVGdata.append(SVG(SVGArtikel: "Art. 2", SVGGesetzestext: "Und das erst recht nicht"))

}

// TableView
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return SVGdata.count
}

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

    let sVG = SVGdata[indexPath.row]
    if let SVGCell = cell as? SVGCell {
        SVGCell.setSVG(sVG)
    }

    return cell
}

}

成千上万的视频如何在简单的数组中进行搜索。但不是我的解决方案。

2 个答案:

答案 0 :(得分:0)

当您拥有TableView时,我知道添加搜索栏的两种方法,因此建议您首先确定哪种实现更适合您的应用:

第一个,如果您有UINavigationController,则可以使用将出现在导航栏中的搜索栏的本机实现。我的意思是,您首先需要以编程方式或通过故事板将UINavitationController添加到视图控制器中。然后,您应该创建一个UISearchController并将其与UINavigationController关联。最后,通过导航搜索栏中发生的UISearchController Delegate监听事件,以便您可以更新视图。

https://www.raywenderlich.com/472-uisearchcontroller-tutorial-getting-started

第二种方法是一个搜索栏,该搜索栏通过其标题与tableView关联,请阅读一些教程,直到完成为止。

https://www.ioscreator.com/tutorials/add-search-table-view-ios-tutorial

答案 1 :(得分:0)

您可以使用UISearchBar进行此操作。 首先在故事板中的tableView所在的同一viewController上添加一个UISearchBar(在iOS等表格视图顶部添加搜索栏。然后在app中添加引用),如下代码:

@IBOutlet weak var searchBar: UISearchBar!

然后在viewDidLoad中添加委托:

self.searchBar.delegate = self

我有两个dataArray allData,filteredData。在allData中,我保留了表格的所有数据(未在任何地方进行更改),并且filterData用于获取过滤结果。 因此,在将数据填充到allData之后,我已经完成了(viewWillAppear):

filteredData = allData

因此,所有tableView委托,数据源都使用了filteredData。
然后扩展您的viewController(使扩展不是强制性的)以符合UISearchBarDelegate:

当您将SVGdata(我使用filteredData)用于tableView时,过滤之后,必须在重新加载表之前将所有过滤后的数据放入SVGdata中。

extension YourViewController: UISearchBarDelegate{
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    // searchText will contain user input
    // in allData I have kept all data of the table
    // filteredData used to get the filtered result
        if (searchText == ""){
            filteredData = allData
        }
        else{
            filteredData = []
        // you can do any kind of filtering here based on user input
            filteredData = allData.filter{
                $0.cName.lowercased().contains(searchText.lowercased())
            }   
        }
    // lastly you need to update tableView using filteredData so that the filtered rows are only shown
    //As you use SVGdata for tableView, after filtering you have to put all filtered data into SVGdata before reloading the table.
        self.tableView.reloadData()
    }
}