Панель поиска в табличном представлении Swift

Я делаю простой проект в Xcode 6 и хочу добавить панель поиска в tableviewcontroller, но у меня что-то не работает. Я делаю это с помощью этого руководства http://www.raywenderlich.com/76519/add-table-view-search-swift

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if tableView == self.searchDisplayController!.searchResultsTableView {
        return self.filteredProgramy.count
    } else {
        return self.programy.count
    }
}

здесь я получаю сообщение об ошибке «фатальная ошибка: неожиданно найден ноль при развертывании необязательного значения». не знаю почему. весь код здесь

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if tableView == self.searchDisplayController!.searchResultsTableView {
        return self.filteredProgramy.count
    } else {
        return self.programy.count
    }
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell

    var program : Program

    if tableView == self.searchDisplayController!.searchResultsTableView {
        program = filteredProgramy[indexPath.row]
    } else {
        program = programy[indexPath.row]
    }


func filterContentForSearchText(searchText: String) {
    // Filter the array using the filter method
    var scope = String()
    self.filteredProgramy = self.programy.filter({( program: Program) -> Bool in
        let categoryMatch = (scope == "All") || (program.category == scope)
        let stringMatch = program.name.rangeOfString(searchText)
        return categoryMatch && (stringMatch != nil)
    })
}

func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchString searchString: String!) -> Bool {
    self.filterContentForSearchText(searchString)
    return true
}

func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchScope searchOption: Int) -> Bool {
    self.filterContentForSearchText(self.searchDisplayController!.searchBar.text)
    return true
}

}


person patrikbelis    schedule 27.09.2014    source источник
comment
Эта ошибка не имеет ничего общего с панелью поиска, а связана с пониманием того, как правильно использовать опции. В какой строке вы видите ошибку? Вероятно, вы выполняете принудительную распаковку необязательного значения и получаете nil (как описано в сообщении об ошибке).   -  person Austen Chongpison    schedule 27.09.2014
comment
здесь. если tableView == self.searchDisplayController!.searchResultsTableView {   -  person patrikbelis    schedule 28.09.2014
comment
Вы разобрались с этим?   -  person Austen Chongpison    schedule 30.09.2014
comment
Был ли self.searchDisplayController нулевым?   -  person Austen Chongpison    schedule 30.09.2014
comment
хорошо. теперь я это исправил. Я снова просматриваю ваш ответ и исправил его. спасибо большое чувак! я не видел, что self.searchDisplayController равен нулю.   -  person patrikbelis    schedule 30.09.2014
comment
Большой! Рад, что ты разобрался. Пожалуйста, не забудьте принять или проголосовать за полезные ответы. Это действительно ценится.   -  person Austen Chongpison    schedule 30.09.2014
comment
Но у меня нет клавиатуры в строке поиска и как я могу изменить положение заполнителя?   -  person patrikbelis    schedule 01.10.2014
comment
Мне не совсем понятен ваш вопрос. Я бы порекомендовал загрузить и проверить завершенный образец кода по адресу: cdn2.raywenderlich.com/wp-content/uploads/2014/08/   -  person Austen Chongpison    schedule 01.10.2014
comment
Или, если у вас все еще есть вопросы после просмотра их примера кода, вы можете открыть новый вопрос. Удачи!   -  person Austen Chongpison    schedule 01.10.2014


Ответы (2)


self.searchDisplayController равно нулю.

Я только что загрузил пример кода учебника (который вы также должны сделать), и я вижу, что у автора есть «Контроллер отображения поиска» в их файле пера. Проверьте свой nib-файл и убедитесь, что контроллер Candy Search подключен правильно.

Это должно выглядеть так:

введите здесь описание изображения

Чтобы перейти к этому изображению, щелкните правой кнопкой мыши объект Search Display Controller в файле .xib. Обратите внимание, что на моем изображении «Reference Outlets» имеет связь между searchDisplayController и CandySearch. Это то, чего вам не хватает.

Чтобы создать соединение, перетащите Ctrl с контроллера CandySearch на «Search Display Controller», когда вы отпустите мышь, вы увидите:

введите здесь описание изображения

Нажмите searchDisplayController, и все готово.

Наконец, вы должны прочитать о том, как опции работают в Swift, чтобы помочь вам понять такие проблемы в будущем:

https://developer.apple.com/librarY/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-XID_456

person Austen Chongpison    schedule 28.09.2014

У меня была аналогичная проблема, и я нашел следующее для работы. Переменная «ячейка» в вашем коде равна нулю, потому что, хотя вы установили количество строк, фактический объект ячейки еще не создан (ячейка строки = UITableView (.. ниже)

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell : UITableViewCell
    var player : Player

    if self.searchDisplayController!.active {
        var searchCell: AnyObject? = self.tableView.dequeueReusableCellWithIdentifier("Cell")

        if searchCell == nil {
            cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell")
        } else {
            cell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell
        }            

        player = self.filteredPlayers[indexPath.row]
    } else {
        cell = self.tableView.dequeueReusableCellWithIdentifier(TableCellNamesEnum.PLAYER_DETAIL_CELL.rawValue, forIndexPath: indexPath) as UITableViewCell
        cell.accessoryType = UITableViewCellAccessoryType.Checkmark
        player = self.selectedPlayers[indexPath.row]
    }

    cell.textLabel!.text = "\(player.firstName) \(player.lastName)"

    return cell
}
person as21    schedule 06.02.2015
comment
почему вы смешиваете использование dequeueReusableCellWithIdentifier(_:) и dequeueReusableCellWithIdentifier(_: forIndexPath:) ? почему вы переводите searchCell в AnyObject?. и приведение возвращаемого типа dequeueReusableCellWithIdentifier(_:) к UITableViewCell не должно быть необходимым. - person vikingosegundo; 20.01.2017
comment
В основном потому, что этот код использовался в учебном примере для этой конкретной версии xCode :) - person as21; 30.01.2017