ios - Swift - 在自定义 TableViewController 中使用 SearchBar 时遇到问题

标签 ios swift uitableview search uisearchbar

我是代码新手,我想在我的自定义 TableViewController 中创建一个搜索功能。当我(在搜索栏中)输入与我创建的名称列表(var namen*)中的字母相对应的字母时,出现错误(线程 1:信号 SIGABRT)。当我输入的字母与我的姓名列表中的字母不对应时,我不会收到错误消息。我检查了我的 IBoutlets,但它们不是问题所在。有人知道如何修复错误吗? 这是我最初的 View Controller 代码:(有些名称是荷兰语)

import UIKit

class elementstableviewcontroller: UITableViewController, 
UISearchResultsUpdating{

@IBOutlet var tableview: UITableView!

var namen = ["Waterstof","Helium","Litium","Beryllium","Boor","Koolstof","Stikstof","Zuurstof","Fluor","Neon"]
var afkortingen = ["H","He","Li","Be","B","C","N","O","F","Ne"]
var atoommassas = ["Massa: 1,008","Massa: 4,003","Massa: 6,941","Massa: 9,012","Massa: 10,81","Massa: 12,01","Massa: 14,01","Massa: 16,00","Massa: 19,00","Massa: 20,18"]
var atoomnummers = ["Nummer: 1","Nummer: 2","Nummer: 3","Nummer: 4","Nummer: 5","Nummer: 6","Nummer: 7","Nummer: 8","Nummer: 9","Nummer: 10"]
var ladingen = ["Lading: +1,-1","Lading: 0","Lading: +1","Lading: +2","Lading: +3","Lading: +2,+4,-4","Lading: +1,+2,+3,+4,+5,-1,-2,-3","Lading: -2","Lading: -1","Lading: 0"]
var electronenconfig = ["Config: 1","Config: 2","Config: 2,1","Config: 2,2","Config: 2,3","Config: 2,4","Config: 2,5","Config: 2,6","Config: 2,7","Config: 2,8"]
var searchcontroller : UISearchController!
var resultscontroller = UITableViewController()
var filterednamen = [String]()

override func viewDidLoad() {
    super.viewDidLoad()

    self.resultscontroller.tableView.dataSource = self
    self.resultscontroller.tableView.delegate = self
    self.searchcontroller = UISearchController(searchResultsController: self.resultscontroller)
    self.tableView.tableHeaderView = self.searchcontroller.searchBar
    self.searchcontroller.searchResultsUpdater = self
    self.searchcontroller.dimsBackgroundDuringPresentation = false
    definesPresentationContext = true
}
func updateSearchResults(for searchController: UISearchController) {
    self.filterednamen = self.namen.filter { (naam:String) -> Bool in
        if naam.lowercased().contains(self.searchcontroller.searchBar.text!.lowercased()) {
            return true
        }else{
            return false
        }
    }
    self.resultscontroller.tableView.reloadData()

}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if tableView == self.tableView{
        return  self.namen.count
    }else {
        return self.filterednamen.count
    }
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
    cell.afkorting.text = afkortingen[indexPath.row]
    cell.name.text = namen[indexPath.row]
    cell.atoommassa.text = atoommassas[indexPath.row]
    cell.elektronenconfiguratie.text = electronenconfig[indexPath.row]
    cell.atoomnummer.text = atoomnummers[indexPath.row]
    cell.lading.text = ladingen[indexPath.row]


    if tableView == self.tableView{
            //cell.textLabel?.text = self.namen[indexPath.row]
            cell.name.text = self.namen[indexPath.row]
    }else{
            //cell.textLabel?.text = self.filterednamen[indexPath.row]
            cell.name.text = self.filterednamen[indexPath.row]

    }
    return cell
}

}

这是我的 CustomCell 代码:

import UIKit

class CustomCell: UITableViewCell {

@IBOutlet var elektronenconfiguratie: UILabel!
@IBOutlet var atoomnummer: UILabel!
@IBOutlet var atoommassa: UILabel!
@IBOutlet var name: UILabel!
@IBOutlet var afkorting: UILabel!
@IBOutlet var lading: UILabel!
override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

}

*namen = 名称,naam = 从荷兰语翻译成英语的名称

最佳答案

尝试在 shouldChangeTextIn SearchBar 方法中实现过滤功能,如下所示

func searchBar(_ searchBar: UISearchBar, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {

   self.filterednamen = self.namen.filter { (naam:String) -> Bool in

return naam.lowercased().contains(self.searchcontroller.searchBar.text!.lowercased()) 
    }
    self.resultscontroller.tableView.reloadData()

}

关于ios - Swift - 在自定义 TableViewController 中使用 SearchBar 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45506598/

相关文章:

ios - 删除时该行不会在 UITableView 中消失

ios - 此应用程序正在从后台线程修改自动布局引擎 - ios 9

ios - 如何在 iOS 的 UIWebView 上禁用长按手势

ios - 为什么 SignalProducer 不返回信号?

ios - UITableViewCell 中的自定义附件按钮

ios - Swift 3 数组限制

objective-c - 如何计算frame.size.width

ios - 30秒后如何画线并删除?

ios - 为什么这些数字没有添加到 Xcode 调试器中?

ios - View 关闭后快速更新按钮文本