我有一个用于填充表格视图的结构数组。但是我无法使我的searchBar正常工作。我最初的searchBar代码是在使用更多“基本”数组时创建的。转换为struct后,它将不再起作用。我从Xcode收到3个错误。我用//
import UIKit
struct Material {
var name : String
var lbft : String
var gcm : String
}
class ViewController: UIViewController {
@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet var tableView: UITableView!
let materialData = [
Material(name: "Acetaminohen Powder, Unmilled", lbft: "43", gcm: "0.688794"),
Material(name: "Acetylene Black, 100% Compressed", lbft: "35", gcm: "0.560646"),
Material(name: "Acetylsalicyic Acid", lbft: "20", gcm: "0.320369"),
Material(name: "Acrylamide", lbft: "34", gcm: "0.54463"),
Material(name: "Acrylic Granules, Coarse", lbft: "40", gcm: "0.64"),
Material(name: "Acrylic Granules, Fine", lbft: "36", gcm: "0.58"),
Material(name: "Acrylonitrile Butadien Styrene (Abs) Resin", lbft: "50", gcm: "0.8"),
Material(name: "Acrylonitrile Butadiene Styrene (Abs) Granules", lbft: "36", gcm: "0.58"),
Material(name: "Activated Alumina", lbft: "42.5", gcm: "0.68"),
Material(name: "Activated Carbon", lbft: "32.5", gcm: "0.52"),
Material(name: "Actylene Black", lbft: "45.5", gcm: "0.73"),
Material(name: "Aero Xanthates", lbft: "112.5", gcm: "1.8"),
Material(name: "Aerolyte", lbft: "51", gcm: "0.82"),
Material(name: "Aerosil, Fumed Silica", lbft: "32", gcm: "0.51"),
Material(name: "Aerosil, Silicon Dioxide", lbft: "30", gcm: "0.48"),
Material(name: "Alaluren", lbft: "112", gcm: "1.79")]
var searchMaterial = [String]()
var searching = false
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
}
extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}
}
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if searching {
return searchMaterial.count
} else {
return materialData.count
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.numberOfLines = 0
if searching {
cell.textLabel?.text = searchMaterial[indexPath.row]
} else {
cell.textLabel?.text = materialData[indexPath.row] // <-- ERROR Cannot assign value of type 'Material' to type 'String'
}
return cell
}
}
extension ViewController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
searchBar.setShowsCancelButton(true, animated: true)
searchMaterial = materialData.filter({$0.prefix(searchText.count) == searchText}) // <-- ERROR Cannot assign value of type '[Material]' to type '[String]'
// <-- ERROR Value of type 'Material' has no member 'prefix'
searching = true
tableView.reloadData()
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchBar.setShowsCancelButton(false, animated: true)
searching = false
searchBar.text = ""
tableView.reloadData()
}
}
没有
materialData[0] etc...
声明您的数组,例如
var searchMaterial:[String] = []
然后您可以像访问它一样
searchMaterial[indexPath.row]
1)cell.textLabel?.text = materialData [indexPath.row]materialData [indexPath.row]将为您提供材料类型而不是字符串的对象。不知道您期望什么值。但是将其更改为
materialData[indexPath.row].name
2)searchMaterial = materialData.filter({$ 0.prefix(searchText.count)== searchText})//
更改为
var searchMaterial:[Material] = []
searchMaterial = materialData.filter { $0.name.contains(searchText) }