搜索自定义表格视图单元格不起作用并返回nil

时间:2017-07-10 02:34:40

标签: ios swift uitableview swift3 uisearchbar

我有一个UIViewController,它充当TableViewController,最重要的是搜索栏。在搜索栏中搜索应该过滤它正在执行的数组中的结果,尽管我有一个我想要使用的自定义单元格,但它返回的是null。

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating {

    @IBOutlet var tableView: UITableView!

    @IBOutlet weak var searchBar: UISearchBar!

    struct Cake {
        var name = String()
        var type = String()
    }

    var cakes = [Cake(name: "avocado", type: "fruit"),
             Cake(name: "blueberry", type: "fruit"),
             Cake(name: "swerve", type: "sweetener")]

    var isSearching = false

    let searchController = UISearchController(searchResultsController: nil)

    var filteredCakes = [Cake]()

    //var filteredFoodIDescArray = [String]()
    //var filteredFoodImgArray = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()
        filteredCakes = cakes
        searchController.searchResultsUpdater = self
        searchController.dimsBackgroundDuringPresentation = false
        definesPresentationContext = true
        tableView.tableHeaderView = searchController.searchBar

        self.tableView.register(ViewControllerTableViewCell.self, forCellReuseIdentifier: "cell")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.filteredCakes.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell  {
        //let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "cell")

        var cell = self.tableView!.dequeueReusableCell(withIdentifier: "cell") as! ViewControllerTableViewCell

        //cell.foodItemTitle.text = self.filteredCakes[indexPath.row].name

        cell.detailTextLabel?.text = self.filteredCakes[indexPath.row].name
        //cell.detailTextLabel?.text = self.filteredCakes[indexPath.row].size

        return cell
    }

    func updateSearchResults(for searchController: UISearchController) {
        // If we haven't typed anything into the search bar then do not filter the results
        if searchController.searchBar.text! == "" {
            filteredCakes = cakes
        } else {
            // Filter the results
            filteredCakes = cakes.filter { $0.name.lowercased().contains(searchController.searchBar.text!.lowercased()) }
        }

        self.tableView.reloadData()
    }

}

出现编译错误:UIType'UITableViewCell'的值在此行没有成员'foodItemTitle':cell.foodItemTitle.text = self.filteredCakes[indexPath.row].name

class ViewControllerTableViewCell: UITableViewCell {

    @IBOutlet weak var foodItemTitle: UILabel!
    @IBOutlet weak var foodItemDesc: UILabel!
    @IBOutlet weak var foodItemImg: UIImageView!

    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
    }

}

它会在fatal error: unexpectedly found nil while unwrapping an Optional value上返回cell.foodItemTitle.text = self.filteredCakes[indexPath.row].name。如果我使用UITableViewCell而不是Custom单元,它可以工作,但不是。

如何以实际分配ViewControllerTableViewCell文字标签的方式声明自定义单元格?

3 个答案:

答案 0 :(得分:3)

当您使用Prototype单元格时,无需使用tableView注册单元格,它将自动注册tableView。因此,只需从register中删除viewDidLoad代码,然后您就可以开始使用。

删除此行:

self.tableView.register(ViewControllerTableViewCell.self, forCellReuseIdentifier: "cell")

答案 1 :(得分:0)

首先需要获得nib

ViewControllerTableViewCell
let nib = UINib(nibName: "YOUR_CUSTOM_CELL_NIB_NAME", bundle: nil)
tableView.register(nib, forCellReuseIdentifier: "YOUR_CUSTOM_CELL_ID")

答案 2 :(得分:0)

您可以强行解包的唯一地方是这行代码cell.foodItemTitle.text。您宣布foodItemTitleUILabel!

确保将自定义类名设置为故事板上的自定义单元格,然后将其正确连接为

enter image description here