搜索自定义表格视图单元格不起作用并返回 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 Cocoa Touch 自定义单元格为 IBOutlets 返回 nil