簡體   English   中英

Swift-自定義TableViewController中的SearchBar有問題

[英]Swift - Having problems with SearchBar in a custom TableViewController

我是新手,我想在我的Custom TableViewController中創建一個Search函數。 當我在搜索欄中輸入與創建的名稱列表(變量名*)相對應的字母時,出現錯誤(線程1:信號SIGABRT)。 當我輸入的字母與名稱列表中的字母不對應時,我不會收到錯誤消息。 我檢查了我的IBoutlets,但這不是問題。 有人知道如何解決錯誤嗎? 這是我最初的viewcontroller代碼:(某些名稱是荷蘭語)

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

}

您的代碼有幾個問題。

首先,您不必要地創建了UITableViewIBOutlet 從您的代碼中刪除它。

其次,您正在使用該表視圖檢查是否正在搜索。 這是不必要的,因為您想在同一視圖控制器中顯示搜索結果,因此正確的布爾檢查是:

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

最后,發生錯誤的原因恰恰是最后一個問題:您正在將searchResultsController設置為幻像表視圖,因此它會導致斷言失敗,因為它無法找到標識為“ cell”的單元格。

這是固定代碼:

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
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM