scopeButtonTitles is always nil



我不明白为什么我的scopeButtonTitles总是为零。我遵循了 RayWenderlich 的教程,但不同之处在于我的搜索栏应该从中获取范围按钮标题的元素数组是从数据库中加载的。

但是我仔细检查了一下,我的数组加载良好,而不是零。何时设置范围按钮标题?也许是在我的数组初始化之前?

这是我的代码:

var bottlesArray: Array<Bottle>!
override func viewDidLoad() {
    super.viewDidLoad()
    loadBottles() // loads elements from a DB and initialise bottlesArray
}
func filterContentForSearchText(searchText: String, scope: String = "All") {
    // Filter the array using the filter method
    self.filteredBottles = self.bottlesArray.filter({(bottle: Bottle) -> Bool in
        var categoryMatch = (scope == "All") || (bottle.category == scope)
        // The two following line put the search string AND the matching string in Lower case and accent tolerent so, for example "Dôle" == "dole" -> true
        var lowerCaseNoAccentTitle: String = NSString(data: bottle.title.lowercaseString.dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion: true)!, encoding: NSUTF8StringEncoding)!
        var lowerCaseNoAccentSearchText: String = NSString(data: searchText.lowercaseString.dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion: true)!, encoding: NSUTF8StringEncoding)!
        var stringMatch = lowerCaseNoAccentTitle.rangeOfString(lowerCaseNoAccentSearchText)
        return categoryMatch && (stringMatch != nil)
    })
}
func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchString searchString: String!) -> Bool {
    let scopes = self.searchDisplayController!.searchBar.scopeButtonTitles as [String]
    let selectedScope = scopes[self.searchDisplayController!.searchBar.selectedScopeButtonIndex] as String
    self.filterContentForSearchText(searchString, scope: selectedScope)
    return true
}
func searchDisplayController(controller: UISearchDisplayController!,
    shouldReloadTableForSearchScope searchOption: Int) -> Bool {
        let scope = self.searchDisplayController!.searchBar.scopeButtonTitles as [String]
        self.filterContentForSearchText(self.searchDisplayController!.searchBar.text, scope: scope[searchOption])
        return true
}

所以,需要明确的是,self.searchDisplayController!.searchBar不是零,而是scopeButtonTitles。如果我手动设置self.searchDisplayController!.searchBar.scopeButtonTitles那么范围栏就可以了。但是在教程中,它是自动加载的。

我真的不明白什么时候应该填充scopeButtonTitles数组。

在演示项目中,应该有一个我认为您缺少的scopeButtonTitles的初始化,您应该在项目的viewDidLoad函数中添加以下行。

searchController.searchBar.scopeButtonTitles = ["All"]

最新更新