Я не понимаю, почему мой scopeButtonTitles всегда равен нулю. Я следовал за учебником от RayWenderlich, но разница в том, что мой массив элементов, которые моя панель поиска, как предполагается, получает заголовки кнопок области, загружается из базы данных.scopeButtonTitles всегда ниль
Но я тщательно проверил, и мой массив хорошо загружен, а не ноль. Когда установлен параметр scopeButtonTitles? Может быть, это до того, как мой массив инициализирован?
Вот мой код:
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
будет заполнен.
Это именно тот вопрос, который вы должны задать автору учебника. –