我正在嘗試將 UISearchBar 添加到從 db 呼叫獲取資料的 UITableviewController 中。我在情節提要的 tableview 上方添加了 uisearchbar,并使插座在類宣告和 viewdidload 中添加了委托。代碼看起來是正確的,但是在 searchClients 函式中輸入時我沒有得到任何反應。不知道我錯過了什么。控制臺中沒有顯示錯誤。
import UIKit
class TableViewController: UITableViewController, UISearchBarDelegate {
var CompanyID = ""
var CompanyName = ""
var ClientList = [Client]()
var filteredArray = [Client]()
let URL_SERVICE = "https://fetch.php"
@IBOutlet var searchClients: UISearchBar!
override func viewDidLoad() {
super.viewDidLoad()
searchClients.delegate = self
filteredArray = ClientList
// omitted call to get data, as it loads fine initially
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return filteredArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Client", for: indexPath)
let client = filteredArray[indexPath.row]
let title = client.Name
cell.textLabel?.text = title
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.CompanyID = filteredArray[indexPath.row].CompanyID
self.CompanyName = filteredArray[indexPath.row].Name
}
func searchClients(_ searchBar: UISearchBar, textDidChange searchText: String) {
//let text: String = self.searchClients.text ?? ""
print("search for \(searchText)")
self.filteredArray = []
if (searchText == "") {
self.filteredArray = self.ClientList
} else {
for item in self.ClientList {
if (item.Name.lowercased().contains(searchText.lowercased())) {
self.filteredArray.append(item)
}
}
}
print(filteredArray)
self.tableView.reloadData()
}
}
我在這里缺少什么使 searchBar 功能無法觸發?
uj5u.com熱心網友回復:
UISearchBarDelegate由于您的searchClients函式未正確命名,因此您沒有實作任何方法。您需要將其重命名searchBar為實際實作委托協議中的功能。
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
幾個挑剔
- 在 Swift 中,我們以小寫字母開頭來命名屬性
var companyID = ""
var companyName = ""
var clientList = [Client]()
var filteredArray = [Client]()
let urlService = "https://fetch.php"
self.當參考宣告型別范圍內的屬性或函式時,您可以跳過作為前綴添加的每一個。
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
companyID = filteredArray[indexPath.row].companyID
companyName = filteredArray[indexPath.row].name
}
- 當使用擴展實作協議一致性時,它會更干凈,因此代碼很好地分離并且它們不會相互混合。
extension TableViewController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
//let text: String = self.searchClients.text ?? ""
print("search for \(searchText)")
filteredArray = []
if searchText == "" {
filteredArray = clientList
} else {
filteredArray = clientList.filter { item in
item.name.lowercased().contains(searchText.lowercased())
}
}
print(filteredArray)
tableView.reloadData()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/495239.html
