Проблема фильтрации на панели поиска - PullRequest
1 голос
/ 14 мая 2019

Я новичок в swift, я пытаюсь отфильтровать имя из массива, используя панель поиска в консоли, получаю то, что я ввел в панель поиска, но при фильтрации по предикату я не получаю отфильтрованное имя ... пожалуйста, кто-нибудь может помочь вэтот выпуск

var caseListOfBooker:[CaseDetails]=[]

var searchString:String=""

var filteredString = [String]()

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

            searchString = searchText
            updateSearchResults()
            tableview.reloadData()
        }
        func updateSearchResults(){

        filteredString.removeAll(keepingCapacity: false)

        let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchString)

        let array = self.caseListOfBooker.filter{$0.person_of_interest.contains(searchString)}
            print(array)

                    if let list=array as? [String]{
                        filteredString=list
                    }


            print(filteredString)

            tableview.reloadData()



    }


extension SearchPOIVC : UITableViewDelegate, UITableViewDataSource {

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if filteredString != []{

            return filteredString.count
        }
        else
        {
            if searchString != "[]" {
                return caseListOfBooker.count
            }else {
                return 0
            }
        }

    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 80.00
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell:POIProfileDetailsCell = tableview.dequeueReusableCell(withIdentifier: "POIProfileDetailsCell", for: indexPath) as! POIProfileDetailsCell
        if filteredString != []{

            cell.poiName.text = filteredString[indexPath.row]

            return cell
        }else{

            if searchString != "[]"{
                 cell.poiName.text = self.caseListOfBooker[indexPath.row].person_of_interest

            }
            return cell

        }

    }

Ответы [ 3 ]

1 голос
/ 14 мая 2019

Наиболее эффективный способ фильтрации пользовательских классов - это использование того же типа для массива источника данных и отфильтрованного массива

var caseListOfBooker = [CaseDetails]()
var filteredBooker = [CaseDetails]()

Добавить свойство isFiltering, для которого задано значение true, когда текст поиска не пустой

var isFiltering = false

и удалить searchString и filteredString

var searchString:String=""
var filteredString = [String]()

В updateSearchResults фильтровать массив источника данных (с собственными функциями Swift), установить isFiltering соответственно и перезагрузить представление таблицы

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    print("searchText \(searchText)")
    updateSearchResults(searchText: searchText)
}

func updateSearchResults(searchText: String) {
    if searchText.isEmpty {
        filteredBooker.removeAll()
        isFiltering = false
    } else {
        filteredBooker = caseListOfBooker.filter{$0.person_of_interest.range(of: searchText, options: .caseInsensitive) != nil }
        isFiltering = true
    }
    tableview.reloadData()
}

В табличном представлении методы источника данных отображают данные в зависимости от isFiltering

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return isFiltering ? filteredBooker.count : caseListOfBooker.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableview.dequeueReusableCell(withIdentifier: "POIProfileDetailsCell", for: indexPath) as! POIProfileDetailsCell
    let booker = isFiltering ? filteredBooker[indexPath.row] : caseListOfBooker[indexPath.row]
    cell.poiName.text = booker.person_of_interest
}
1 голос
/ 14 мая 2019
let array = self.caseListOfBooker.filter{$0.person_of_interest.contains(searchString)}

Вы получаете массив CaseDetails объектов и пытаетесь привести к массиву String

Не удалось. Вам необходимо получить строковые значения из объекта CaseDetails и объединить их

Используйте

filteredString = array.map { $0.person_of_interest }

Или

for caseDetail in array {
    filteredString.append(caseDetail.person_of_interest)
}

Вместо

if let list = array as? [String]{
    filteredString=list
}
0 голосов
/ 14 мая 2019
var searchPredicate = NSPredicate()
searchPredicate = NSPredicate(format: "self CONTAINS[C] %@", your_searching_text)        
let Final_Search_array = (Your_Array).filtered(using: searchPredicate)
...