uitableview - 搜索显示 Controller 导致崩溃

标签 uitableview swift uisearchbar uisearchdisplaycontroller

我正在尝试使用 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属性。

此外,值得注意的是UISearchDisplayControllerUISearchDisplayDelegate在 iOS 8 中已弃用,因此您应该使用 UISearchController .

关于uitableview - 搜索显示 Controller 导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29589621/

相关文章:

ios - 联系人和麦克风请求访问在 iOS 9 上不起作用

ios - UISearchController 在调用时更改状态栏颜色

ios - 如何在 iOS Swift 项目中访问 UITableViewCell contentView 的 subview 中的变量

ios - 空的 UITableView

ios - 如何将 preferredMaxLayoutWidth 用作我的 UILabel 的自动设置并找出其 View 的高度?

swift - 无法将 UIImage 类型的值转换为预期的参数类型字符串

iOS 9 - Xcode : "Follows Readable Width" programmatically

iOS 11 在首次呈现搜索 Controller 后隐藏范围栏

iOS:背景颜色——UITableView 和 Accessory 具有相同的背景颜色

ios - 将 UISearchBar 背景更改为自定义图像的正确方法是什么?