我有5个标签,它们从tableView
上的每个单元格中的SQL Query数组中接收数据。我想在它上面实现搜索栏。搜索栏应搜索1个特定标签的数据。它正在工作并过滤特定标签,但是当它被过滤时,其他4个标签将不会更新,它们根本不会更改。我无法弄清楚。由于我只有1个来自搜索栏条目的过滤数据,我不知道应该如何过滤其他数据。谢谢
编辑:仍然无法弄清楚类和添加数据,我有一个错误
“类型'[String]'的值没有成员'localizedCaseInsensitiveContains'”
在搜索栏功能
import UIKit
class TableViewController: UITableViewController, UISearchBarDelegate, UISearchDisplayDelegate {
var data:[MyData] = []
@IBOutlet weak var searchBar: UISearchBar!
var searchActive : Bool = false
var filtered:[MyData] = []
@IBAction func sqlExecute(_ sender: AnyObject) {
var client = SQLClient()
client.connect("sql_ip", username: "username", password: "password", database: "database") {
success in
if success {
client.execute("sql query") {
result in
for table in result as Any as! NSArray {
for row in table as! NSArray {
for column in row as! NSDictionary {
if column.key as! String == "data1" {
MyData.init(data1: "\(column.value)")
} else if column.key as! String == "data2" {
MyData.init(data2: column.value as! Double)
} else if column.key as! String == "data3" {
MyData.init(data3: "\(column.value)")
} else if column.key as! String == "data4" {
MyData.init(data4: "\(column.value)")
} else if column.key as! String == "data5" {
MyData.init(data5: "\(column.value)")
}
}
}
}
client.disconnect()
self.tableView.reloadData()
}
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
searchBar.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if(searchActive) {
return filtered.count
} else {
return data.count
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "segue", for: indexPath)
if(searchActive) {
cell.label1.text = "\(filtered[indexPath.row])"
cell.label2.text = "\(filtered[indexPath.row])"
cell.label3.text = "\(filtered[indexPath.row])"
cell.label4.text = "\(filtered[indexPath.row])"
cell.label5.text = "\(filtered[indexPath.row])"
} else {
cell.label1.text = "\(data[indexPath.row])"
cell.label2.text = "\(data[indexPath.row])"
cell.label3.text = "\(data[indexPath.row])"
cell.label4.text = "\(data[indexPath.row])"
cell.label5.text = "\(data[indexPath.row])"
}
cell.backgroundColor = UIColor.clear
cell.selectionStyle = UITableViewCellSelectionStyle.none
return cell
}
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
searchActive = true;
}
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
searchActive = false;
self.searchBar.endEditing(true)
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchActive = false;
self.searchBar.endEditing(true)
}
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchActive = false;
self.searchBar.endEditing(true)
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filtered = data.filter { $0.data1.localizedCaseInsensitiveContains(searchText) }
if(filtered.count == 0){
searchActive = false;
} else {
searchActive = true;
}
self.tableView.reloadData()
}
这是类文件:
import Foundation
class MyData {
var data1 = [String]()
var data2 = [Double]()
var data3 = [String]()
var data4 = [String]()
var data5 = [String]()
init(data1: String) {
self.data1.append(data1)
}
init(data2: Double) {
self.data2.append(data2)
}
init(data3: String) {
self.data3.append(data3)
}
init(data4: String) {
self.data4.append(data4)
}
init(data5: String) {
self.data5.append(data5)
}
}
你的问题是你有五个不同的数组而不是你需要有一个类型Dictionary
或自定义Struct
/ class
的数组。如果你像这样使用struct
/ class
,那就太棒了。
class MyData {
var data1: String!
var data2: Double!
var data3: String!
var data4: String!
var data5: String!
init(data1: String, data2: Double, data3: String, data4: String, data5: String) {
self.data1 = data1
self.data2 = data2
self.data3 = data3
self.data4 = data4
self.data5 = data5
}
}
现在,而不是有五个不同的数组和一个用于过滤器创建两个类型为Array
的[MyData]
,其中一个用于显示filterData并使用tableView
方法并像这样过滤它。
使用MyData
方法创建init
的对象并将其附加到数据Array然后像这样过滤你的searchBar委托。
filtered = data.filter { $0.data1.localizedCaseInsensitiveContains(searchText) }
上面的过滤器将在数据数组中搜索并返回属性data1
包含searchText的所有对象。
你的整个代码都是这样的
import UIKit
class TableViewController: UITableViewController, UISearchBarDelegate, UISearchDisplayDelegate {
var data:[MyData] = []
@IBOutlet weak var searchBar: UISearchBar!
var searchActive : Bool = false
var filtered:[MyData] = []
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
searchBar.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if(searchActive) {
return filtered.count
} else {
return data.count
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "segue", for: indexPath)
if(searchActive) {
cell.label1.text = filtered[indexPath.row].data1
cell.label2.text = filtered[indexPath.row].data2
cell.label3.text = filtered[indexPath.row].data3
cell.label4.text = "\(filtered[indexPath.row].data4) ₺"
cell.label5.text = filtered[indexPath.row].data5
} else {
cell.label1.text = data[indexPath.row].data1
cell.label2.text = data[indexPath.row].data2
cell.label3.text = data[indexPath.row].data3
cell.label4.text = "\(data[indexPath.row].data4) ₺"
cell.label5.text = data[indexPath.row].data5
}
cell.backgroundColor = UIColor.clear
cell.selectionStyle = UITableViewCellSelectionStyle.none
return cell
}
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
searchActive = true;
}
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
searchActive = false;
self.searchBar.endEditing(true)
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchActive = false;
self.searchBar.endEditing(true)
}
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchActive = false;
self.searchBar.endEditing(true)
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filtered = data.filter { $0.data1.localizedCaseInsensitiveContains(searchText) }
if(filtered.count == 0){
searchActive = false;
} else {
searchActive = true;
}
self.tableView.reloadData()
}
}
编辑:你需要像这样使用单个数组。
for table in result as Any as! NSArray {
for row in table as! NSArray {
if let dic = row as? [String : Any] {
let data1 = dic["data1"] as! String
let data2 = dic["data2"] as! Double
let data3 = dic["data3"] as! String
let data4 = dic["data4"] as! String
let data5 = dic["data5"] as! String
let newData = MyData(data1: data1, data2: data2, data3: data3, data4: data4, data5: data5)
self.data.append(newData)
}
}
}
self.tableView.reloadData()
首先,您必须创建一个全局数组,然后在搜索栏委托中对其进行排序。
extension HVUserLisitingViewController : UITableViewDelegate , UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return filterUser.count
}
}
extension HVUserLisitingViewController : UISearchBarDelegate {
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
return true
}
func searchBarShouldEndEditing(_ searchBar: UISearchBar) -> Bool {
return true }
func searchBar(_ searchBar: UISearchBar, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
return true
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { // called when text changes (including clear)
webserviceSearchBy(text: searchBar.text!)
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
filterUser.removeAll()
filterUser = users
tableview.reloadData()
}
func webserviceSearchBy(text : String) {
if text.lowercased().count == 0 {
filterUser.removeAll()
filterUser = users
tableview.reloadData()
return
}
filterUser.removeAll()
filterUser = users.filter({ (user) -> Bool in
if user.username.lowercased().range(of:text.lowercased()) != nil {
return true
}
return false
})
tableview.reloadData()
}
}