我正在尝试使用 TableView 设置搜索栏,以便我可以过滤 TableView ,我正在尝试以编程方式完成这一切。尽管我的代码不断发回错误:在解包可选值时意外发现 nil
。错误在func numberOfRowsInSection
内部,我已经标记了。它与 SearchDisplayController 有关,我认为它是零?代码:
struct UserMatches {
var finalMatchesName : String
var finalMatchesAge : Int
var finalMatchesLocation : PFGeoPoint
var finalMatchesImage : NSData
}
class Matches: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate, UISearchDisplayDelegate {
var tableView = UITableView()
var searchBar = UISearchBar()
var userMatches = [UserMatches]()
var filterUsers = [UserMatches]()
override func viewDidLoad() {
super.viewDidLoad()
createTableView()
}
func filterContentForSearchText(searchText: String) {
self.filterUsers = self.userMatches.filter({(user1: UserMatches) -> Bool in
let stringMatch = user1.finalMatchesName.rangeOfString(searchText)
return (stringMatch != nil)
})
}
func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchString searchString: String!) -> Bool {
self.filterContentForSearchText(searchString)
return true
}
func createTableView() {
tableView.sizeToFit()
tableView.dataSource = self
tableView.delegate = self
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
searchBar.sizeToFit()
searchBar.delegate = self
searchBar.showsScopeBar = true
searchBar.searchBarStyle = UISearchBarStyle.Minimal
searchBar.showsCancelButton = true
searchBar.returnKeyType = UIReturnKeyType.Search
tableView.tableHeaderView = searchBar
var searchDispCont = UISearchDisplayController(searchBar: searchBar, contentsController: nil)
searchDispCont.delegate = self;
searchDispCont.searchResultsDataSource = self;
searchDispCont.searchResultsDelegate = self;
self.view.addSubview(tableView)
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView == self.searchDisplayController!.searchResultsTableView { //fatal error: unexpectedly found nil while unwrapping an Optional value
return self.filterUsers.count
} else {
return self.userMatches.count
}
}
}
最佳答案
是的,你的 View Controller 的searchDisplayController
属性的类型为UISearchDisplayController?
(可选),并且是 nil
里面tableView(_:numberOfRowsInSection:)
。当您使用 !
强制解开可选内容时,当值为 nil
时,您的应用程序将引发运行时异常(您所看到的异常) .
该属性的原因是 nil
是您以编程方式创建它并指定 nil
对于contentsController
争论。这很可能是:
var searchDispCont = UISearchDisplayController(searchBar: searchBar, contentsController: self)
这将隐式地将其分配给您的 View Controller 的 searchDisplayController
属性。
此外,值得注意的是UISearchDisplayController
和UISearchDisplayDelegate
在 iOS 8 中已弃用,因此您应该使用 UISearchController
.
关于uitableview - 搜索显示 Controller 导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29589621/