Swift - 在自定义TableViewController中遇到SearchBar问题

问题描述:

我是新手代码,我想在自定义TableViewController中创建搜索功能。当我在一个字母中输入(在搜索栏中)时,我得到一个错误(线程1:信号SIGABRT),该字母对应于我制作的名称列表(var namen *)中的一个字母。当我输入一个与我名单中的字母不对应的字母时,我不会收到错误信息。我查了我的IBoutlets,但他们不是问题。有人知道如何解决这个错误吗? 这是我最初的ViewController代码:(一些名字是荷兰)Swift - 在自定义TableViewController中遇到SearchBar问题

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() 

} 

您的代码有几个问题。

首先,您将不必要地创建IBOutlet,UITableView。从你的代码中删除。

其次,您正在使用该表视图来检查您是否正在搜索。也就是说unneccesary,只要你想显示在同一个视图控制器搜索结果,所以正确的布尔检查,而不是为:

!searchcontroller.isActive || searchcontroller.searchBar.text == "" 

最后,出现错误正是因为最后一个问题说:你是设置searchResultsController虚幻表视图,因此它得到断言失败,因为它无法找到一个单元格标识“单元格”。

这里是固定的代码:

import UIKit 

class FirstViewController: UITableViewController, 
UISearchResultsUpdating{ 

    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 filterednamen = [String]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.searchcontroller = UISearchController(searchResultsController: nil) 
     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.tableView.reloadData() 

    } 
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if !searchcontroller.isActive || searchcontroller.searchBar.text == "" { 
      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 !searchcontroller.isActive || searchcontroller.searchBar.text == "" { 
      //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 
    } 

} 
+0

THX的快速响应!有效! –