【问题标题】:Search Display Controller causing crash搜索显示控制器导致崩溃
【发布时间】:2015-04-12 12:46:02
【问题描述】:

我正在尝试使用 TableView 设置 searchBar,以便我可以过滤表格视图,我正在尝试以编程方式完成所有操作。虽然我的代码不断发回错误:unexpectedly found nil while unwrapping an Optional value。错误在func numberOfRowsInSection 里面,我已经标记了。它与 SearchDisplayController 有关,我认为它是 nil 吗?代码:

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
        }
    }
}

【问题讨论】:

    标签: uitableview swift uisearchbar uisearchdisplaycontroller


    【解决方案1】:

    是的,您的视图控制器的searchDisplayController 属性是UISearchDisplayController?(可选)类型,并且是niltableView(_:numberOfRowsInSection:) 内。当您使用 ! 强制解包可选选项时,当值为 nil 时,您的应用将抛出运行时异常(您看到的异常)。

    属性为nil 的原因是您以编程方式创建它并为contentsController 参数指定nil。这很可能是:

    var searchDispCont = UISearchDisplayController(searchBar: searchBar, contentsController: self)
    

    这会将其隐式分配给您的视图控制器的 searchDisplayController 属性。

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

    【讨论】:

    • 谢谢,但这仍然会因完全相同的错误而崩溃?
    • 很好奇。文档表明 searchDisplayController 属性是在 UISearchDisplayController 初始化时设置的。当然,如果tableView(_:numberOfRowsInSection:) 在您创建搜索显示控制器之前 被调用,您仍然会看到崩溃,但我无法确定这是否正在发生......这似乎不太可能假设您在将表格视图添加为子视图之前就已创建它。
    • 这与引用函数的self.searchDisplayController!.searchResultsTableView 有关吗?我从其他来源中挑选了这段代码,因此试图了解正在发生的事情......
    • 看着它,如果这就是原因,我会感到惊讶。编译器应该能够区分属性和方法,我怀疑赋值错误具有误导性,这是因为searchDisplayController 属性是只读的。我首先要确保var searchDispCont = ... 行在tableView(_:numberOfRowsInSection:) 之前被调用。使用调试器单步执行,并确保在执行该行后searchDisplayController 不是nil
    • 好的,我现在已经设法让它运行而不会崩溃,你可以看到我已经编辑了我的代码。虽然现在 numberOfRowsInSection 和 cellForRowAtIndexPath 都没有运行,你能帮忙吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多