Как искать в TableView по разделам и строкам? - PullRequest
0 голосов
/ 10 марта 2019

Как выполнить поиск в TableView по разделам и строкам?

Получить вложенный JSON с сайта.

self.partnerBranchs = try decoder.decode([PartnerBranch].self, from: data)

Модель:

struct PartnerBranch: Decodable {
let id: Int?
let address: String?
let contacts: String?
let name: String?
let logo: String?
let stocks: [Stock]
}

struct Stock: Decodable {
let id: Int?
let title: String?
let description: String?
let images: String?
}

PartnerBranch это секция Фондовая это строка

Как мне искать оба?

Теперь работает толькопо разделам:

func filterContentForSearchText(_ searchText: String) {
partnerBranchsFiltered = partnerBranchs.filter({ (partnerBranch: PartnerBranch) -> Bool in
return partnerBranch.name!lowercased().contains(searchText.lowercased()
})

Насколько я понимаю, мне нужно как-то использовать compactMat для акций.

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

недавно дали ответ, но по какой-то причине удалили:

let normalizedPhrase = searchText.lowercased()

partnerBranchsFiltered = partnerBranchs.filter { (partnerBranch) in
    let normalizedName = partnerBranch.name?.lowercased() ?? ""
    return normalizedName.contains(normalizedPhrase) || partnerBranch.stocks!.contains { $0.title?.lowercased().contains(normalizedPhrase) ?? false }
}

Это работает для меня, но теперь я получаю ошибку Тема 1: Неустранимая ошибка: Индекс выходит за пределы

return partnerBranchsFiltered[section].stocks!.count
0 голосов
/ 10 марта 2019

Я думаю, вам нужно использовать уменьшение здесь.Из того, как я понимаю вашу проблему, кажется, что вы хотите показать весь раздел, если поисковый термин соответствует названию вашего раздела.Но если это не так, вы все равно хотите показать раздел вместе с соответствующими строками.Таким образом, вы могли бы добиться этого с помощью Reduce, например,

let filteredBranchs: [PartnerBranch] = partnerBranchs.reduce(into: []) { (result, branch) in
    let partnerNameMatches = branch.name?.lowercased().contains(searchText.lowercased()) ?? false
    if partnerNameMatches {
        result.append(branch)
    } else {
        let rowMatches = branch.stocks.filter({ (stock) -> Bool in
            return stock.title?.lowercased().contains(searchText.lowercased()) ?? false
        })
        if !rowMatches.isEmpty {
            var filteredPartnerBranch = branch
            filteredPartnerBranch.stocks = rowMatches
            result.append(filteredPartnerBranch)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...