Панель поиска не фильтрует должным образом

У меня есть панель поиска в моем табличном представлении, но когда я сначала нажимаю на панель поиска, результаты исчезают. Если я перейду к другому контроллеру и вернусь, панель поиска будет работать нормально, и все результаты будут отображаться при нажатии на нее.

Вот код:

@IBOutlet weak var toolTable: UITableView!
@IBOutlet weak var searchForTool: UISearchBar!

var searchActive : Bool = false
{
    didSet {
        if searchActive != oldValue {
            toolTable?.reloadData()
        }
    }
}

typealias Item = (data: String, identity: String)

var filtered: [Item] = []
var items: [Item] = [
    (data: " Data1", identity: "A"),
    (data: " Data2", identity: "B")
]

override func viewDidLoad() {
    super.viewDidLoad()

    toolTable.delegate = self
    toolTable.dataSource = self

    searchForTool.delegate = self

}

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
    searchActive = true
}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
    searchActive = false
}

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    searchActive = false
}

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    searchActive = false
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

    filtered = items.filter { item in
        item.data.localizedCaseInsensitiveContains(searchText)
    }

    searchActive = !filtered.isEmpty

    self.toolTable.reloadData()
}


override func numberOfSections(in tableView: UITableView) -> Int {

    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if(searchActive) {
        return filtered.count
    }

    return items.count

}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell

    if(searchActive){
        cell.toolLabel.text = filtered[indexPath.row].data
    } else {
        cell.toolLabel.text = items[indexPath.row].data
    }

    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let vcName: String
    if searchActive {
        vcName = filtered[indexPath.row].identity
    } else {
        vcName = items[indexPath.row].identity
    }
    let viewController = storyboard?.instantiateViewController(withIdentifier: vcName)
    self.navigationController?.pushViewController(viewController!, animated: true)

}

Я уверен, что это какое-то простое решение, я просто не замечаю его.

Любая помощь будет принята с благодарностью.


person Slavic the Slavic    schedule 01.09.2017    source источник
comment
Почему вы не используете UISearchController?   -  person matt    schedule 01.09.2017
comment
Это только первый способ, которым я научился создавать функциональные возможности панели поиска.   -  person Slavic the Slavic    schedule 01.09.2017
comment
Могу я убедить вас найти время, чтобы сделать это правильно? Есть причина, по которой существует UISearchController, и вот она.   -  person matt    schedule 01.09.2017
comment
Меня не удивит, что это лучший метод, и есть хороший шанс, что я вернусь, посмотрю весь свой код и улучшу его, возможно, начиная с этого.   -  person Slavic the Slavic    schedule 01.09.2017
comment
Прохладный. С UISearchController все действия с делегатами, которые вы делаете, будут выполняться за вас автоматически - этот код можно просто вырезать, и все это будет сделано правильно за кулисами.   -  person matt    schedule 01.09.2017


Ответы (1)


Читая ваш код, я вижу, что: searchBarTextDidBeginEditing устанавливает для searchActive значение true. Данные будут перезагружены в соответствии с кодом в didSet. Затем вызывается tableView:numberOfRowsInSection и возвращается filtered.count, что означает 0, поскольку он пуст. Вот почему исчезают результаты.

person nyg    schedule 01.09.2017
comment
Ах я вижу. Какой самый чистый способ решить проблему. Я пробовал несколько вещей, но получал ошибки индекса за пределами допустимого диапазона. - person Slavic the Slavic; 01.09.2017
comment
@SlavictheSlavic Вы можете попробовать удалить метод searchBarTextDidBeginEditing. Я не уверен, что это должно быть здесь. Если это не сработает, вы можете взглянуть на SoundListTableViewController этого проекта: github.com/nyg/iOSSystemSoundsLibrary < / а>. Как видно из снимка экрана, в нем также используется панель поиска без символа UISearchController. - person nyg; 01.09.2017
comment
Удаление searchBarTextDidBeginEditing действительно помогло, насколько я могу судить. Спасибо! - person Slavic the Slavic; 01.09.2017