【发布时间】: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 是的,我刚刚检查了它在情节提要中已连接
标签: ios swift uitableview swift3 uisearchbar