Swift - UISearchBar: EXC_BREAKPOINT (код = 1, субкод = 0x10297eabc) - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть массив, и в этом массиве я выполняю поиск:

func updateSearchResults(for searchController: UISearchController) {
    if searchController.searchBar.text != "" {
        filteredData.removeAll(keepingCapacity: false)
        let textToSearch = searchController.searchBar.text!
        filteredData = feedItems.filter({($0.DesenNo?.lowercased().contains(textToSearch.lowercased()))!})
        listTableView.reloadData()
    } else {
        filteredData.removeAll(keepingCapacity: false)
        listTableView.reloadData()
    }
}

Когда я нажимаю на строку поиска и набираю любую букву или цифру, Xcode выдает следующую ошибку в строке фильтрации:

Тема 1: EXC_BREAKPOINT (код = 1, субкод = 0x10297eabc)

А также вот что я получаю на экране отладки:

[2169: 828959] + [синхронизация CATransaction] вызывается в транзакции

Я не мог понять проблему и не смог ее решить.В интернете не так много вещей.Я надеюсь, что вы можете помочь мне, спасибо!

1 Ответ

0 голосов
/ 18 сентября 2018

Возможная проблема в том, что вы используете принудительное развертывание для необязательного значения.Попробуйте это

func updateSearchResults(for searchController: UISearchController) {
    if let textToSearch = searchController.searchBar.text, textToSearch.isEmpty == false {
        // update search results
    } else {
        // clear search results
    }
}

При таком подходе вы можете быть уверены, что textToSearch не nil и не пустой.

ОБНОВЛЕНИЕ

В этой строке есть еще одно принудительное развертывание

filteredData = feedItems.filter {
    ($0.DesenNo?.lowercased().contains(textToSearch.lowercased()))!
}

Возможно, ваши сущности не имеют свойства DesenNo.Если они этого не сделают, то принудительное развертывание приведет к падению.Отфильтруйте ваш массив следующим образом

let lowercasedSearchline = textToSearch.lowercased()
filteredData = feedItems.filter {
    // Do not include items with empty DesenNo field
    guard let desenNo = $0.DesenNo else { return false }

    // filter items that has that field filled
    return desenNo.lowercased().contains(lowercasedSearchline)
}
...