Как добавить / использовать совпадающее значение, найденное UISearchBar во время поиска в swift? - PullRequest
0 голосов
/ 13 марта 2020

Как вы можете видеть здесь в моем коде, я вложил массив / словарь и поиск, который я должен выполнить по разным ключам вместе, точно так же, как student_name, (student_name) внутри внутри словаря студента, все работает отлично, но только Проблема, с которой я здесь сталкиваюсь, заключается в том, что независимо от того, что обнаружил searchBar, я должен показать в ячейке, но из-за вложенного словаря я не понимаю, как отобразить в ячейке.

cell.nameLbl.text =  (What should I write here to show found values???)

, если мне нужно создать еще один массив для добавления Значения, которые searchBar нашел, тогда вопрос в том, что я должен написать в коде (что я добавляю?)

var foundName:[String] = [] (Declared global variable to save only string that already matched)

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

        filteredData = schoolData.filter{(item:School?) -> Bool in

           return ((item?.resultMap["teacher"] as? String)?.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil) ||
                ((item?.resultMap["class"] as? String)?.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil) ||
                ((((item?.resultMap["student"]) as? [String: Any?])?["student_name"] as? String)?.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil)
        }
        foundName.append(contentsOf: (what should I write here .. ))

    tableView.reloadData()
}

}

Ответы [ 2 ]

1 голос
/ 13 марта 2020

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

cell.nameLbl.text = (Что я должен написать здесь, чтобы показать найденные значения ???)

var foundNames: [String] = []
cell.nameLbl.text = foundNames[indexPath.row]

Изменить поиск удовольствия c, чтобы заполнить найденные значения и использовать карту, чтобы возвращать только результаты (любого из искомых полей) в виде строкового массива. Ниже приведен пример того, как вы можете преобразовать объект schoolData для возврата массива названий школ.

func searchBar(_ searchBar: UISearchBar? = nil, textDidChange searchText: String) {
    let filteredData = schoolData.filter { item in
        return (item.name?.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil)
    }
    foundNames = filteredData.map({
        ($0.name ?? "")
    })
} 

Вот примерные данные, которые я использовал.

var schoolData: [School] = [School(id: 1, name: "First"),
    School(id: 2, name: "Second"),
    School(id: 3, name: "Third"),
    School(id: 4, name: "Four")]


class School {
    var id: Int?
    var name: String?

    init(id: Int, name: String) {
        self.id = id
        self.name = name
    }
}

Дайте мне знать, если у вас есть какие-либо вопросы.

0 голосов
/ 14 марта 2020

вот ответ на мой вопрос, я наконец понял.

 if let title = item?.resultMap["teacher"] as? String, title.prefix(2) == searchText  {
                    self.foundName.append(item?.resultMap["teacher"] as? String ?? "")
                }

Для кода, который я написал,

cell.nameLbl.text =  foundName[indexPath.row]
...