2015-01-12 3 views
2

Я не понимаю, почему мой 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 будет заполнен.

+0

Это именно тот вопрос, который вы должны задать автору учебника. –

ответ

0

В демонстрационном проекте должна быть инициализация для scopeButtonTitles, которую, я думаю, вам не хватает, вы должны добавить следующую строку в viewDidLoad функции вашего проекта.

searchController.searchBar.scopeButtonTitles = ["All"]