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

Posted

技术标签:

【中文标题】搜索自定义表格视图单元格不起作用并返回 nil【英文标题】:Search for custom table view cell does not work and returns nil 【发布时间】:2017-07-10 02:34:40 【问题描述】:

我有一个 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
    


它在cell.foodItemTitle.text = self.filteredCakes[indexPath.row].name 上返回fatal error: unexpectedly found nil while unwrapping an Optional value。如果我使用 UITableViewCell 而不是自定义单元格,它会起作用,否则不会。

如何声明我的自定义单元格,以便我可以实际分配来自ViewControllerTableViewCell 的文本标签?

【问题讨论】:

foodItemTitle 标签是否连接到情节提要?如果连接正确,左边的圆圈应该被填上。 还要确保 filteredCakes 持有任何值 @nathan 是的,它位于 ViewController 中 @fscore 但它是否在情节提要中连接?如果连接被删除,它将导致您遇到的问题。仔细检查@IBOutlet 左侧的小圆圈是否已填充。 @nathan 是的,我刚刚检查了它在情节提要中已连接 【参考方案1】:

当您使用原型单元格时,无需使用tableView 注册该单元格,它将自动为该tableView 注册。因此,只需从 viewDidLoad 中删除 register 代码即可。

删除此行:

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

【讨论】:

【参考方案2】:

您首先需要获取您的ViewControllerTableViewCell 中的nib

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

【讨论】:

使用情节提要时不需要这样做。【参考方案3】:

唯一可以强制解包的地方是这行代码cell.foodItemTitle.text。您将foodItemTitle 声明为UILabel!

确保将自定义类名称设置为情节提要上的自定义单元格,然后像这样正确连接它们

【讨论】:

以上是关于搜索自定义表格视图单元格不起作用并返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

自定义表格视图单元格不滑动

使用 swift 自动调整大小的集合视图单元格不起作用

自定义表格单元格不显示任何内容 - Swift 2

Swift Cocoa Touch 自定义单元格为 IBOutlets 返回 nil

用 jquery 选择 :visible 表格单元格不起作用?

图像的滚动视图在自定义表格视图单元格中不起作用