我在Xcode 6中做了一个简单的项目,我想在tableviewcontroller中添加搜索栏,但有些东西对我不起作用。我是通过本教程完成的 http://www.raywenderlich.com/76519/add-table-view-search-swift
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView == self.searchDisplayController!.searchResultsTableView {
return self.filteredProgramy.count
} else {
return self.programy.count
}
}
这里我得到错误"致命错误:在打开一个可选值"时意外地发现了nil。 idk为什么。整个代码在这里
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView == self.searchDisplayController!.searchResultsTableView {
return self.filteredProgramy.count
} else {
return self.programy.count
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell
var program : Program
if tableView == self.searchDisplayController!.searchResultsTableView {
program = filteredProgramy[indexPath.row]
} else {
program = programy[indexPath.row]
}
func filterContentForSearchText(searchText: String) {
// Filter the array using the filter method
var scope = String()
self.filteredProgramy = self.programy.filter({( program: Program) -> Bool in
let categoryMatch = (scope == "All") || (program.category == scope)
let stringMatch = program.name.rangeOfString(searchText)
return categoryMatch && (stringMatch != nil)
})
}
func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchString searchString: String!) -> Bool {
self.filterContentForSearchText(searchString)
return true
}
func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchScope searchOption: Int) -> Bool {
self.filterContentForSearchText(self.searchDisplayController!.searchBar.text)
return true
}
}
答案 0 :(得分:1)
self.searchDisplayController
是零。
我刚刚下载了教程的示例代码(您也应该这样做),我看到作者的nib文件中有一个“搜索显示控制器”。检查你的nib文件,确保Candy Search
控制器连接正确。
它应该是这样的:
要获取该图像,请右键单击.xib文件中的Search Display Controller
对象。请注意,在我的图片中,“引用Outlets”在searchDisplayController
和CandySearch
之间存在关联。这就是你所缺少的。
要创建连接,请在放开鼠标时从CandySearch
控制器拖动到“搜索显示控制器”,您将看到:
点击searchDisplayController
,你应该好好去。
最后,您应该了解选项如何在Swift中运行,以帮助您了解此类问题:
答案 1 :(得分:-1)
我有一个类似的问题,发现以下工作。 '小区'你的代码中的变量是nil,因为虽然你已经设置了行数,但是还没有创建实际的单元格对象(line cell = UITableView(.. below)
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell : UITableViewCell
var player : Player
if self.searchDisplayController!.active {
var searchCell: AnyObject? = self.tableView.dequeueReusableCellWithIdentifier("Cell")
if searchCell == nil {
cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell")
} else {
cell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell
}
player = self.filteredPlayers[indexPath.row]
} else {
cell = self.tableView.dequeueReusableCellWithIdentifier(TableCellNamesEnum.PLAYER_DETAIL_CELL.rawValue, forIndexPath: indexPath) as UITableViewCell
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
player = self.selectedPlayers[indexPath.row]
}
cell.textLabel!.text = "\(player.firstName) \(player.lastName)"
return cell
}