tableView中过滤coredata模型

Posted

技术标签:

【中文标题】tableView中过滤coredata模型【英文标题】:Filtration coredata model in tableView 【发布时间】:2021-03-23 17:24:22 【问题描述】:

我的 Coredata 中有两个模型,例如:

CountryCD 
 @NSManaged public var id: Int16
 @NSManaged public var title: String?
 @NSManaged public var cities: NSSet?

CityCD 
 @NSManaged public var id: Int16
 @NSManaged public var title: String?
 @NSManaged public var country: CountryCD?

并在 tableView 中显示它,其中包含一定数量的部分和行 country[section].cities[indexPath.row]

我正在尝试在 tableView 中添加过滤 现在的代码是:

*
let filtered = countries
    .compactMap  (($0.cities as? Set<CityCD>)?
                    .filter  $0.title?.lowercased()
                        .contains(text.lowercased()) ?? false  ?? []) 
    .filter  !$0.isEmpty 

它几乎按照我的需要工作,它给了我[[CityCD]],但我需要[CountryCD] 在我的 tableView 中显示过滤结果。 有人可以帮我弄清楚如何解决这个问题吗?

来源Swift Filter Nested Array

【问题讨论】:

let filtered = countries.filter aCountry in guard let cities = aCountry as? Set&lt;CityCD&gt; else return false return cities.contains(where: ( aCity in return aCity.title?.lowercased().contains(text.lowercased()) ?? false ) 可能会成功。 @Larme 你的意思是let cities = aCountry.cities ... 我猜 确实如此。在我的脑海中编译总是有缺陷^^ 你真的想要一个国家的数组,不应该是每个国家的每个匹配的城市,更像是一本字典吗? @JoakimDanielson 谢谢你的提议救了我)用字典和过滤填充 tableView 非常容易.. xD 非常感谢 【参考方案1】:

如果有人遇到我遇到的问题,这是我在@Joakim Danielson 线索的帮助下达成的解决方案

model:

var countriesDict: [CountryCD: Set<CityCD>]
var filteredCountriesDict: [CountryCD: Set<CityCD>]

populate:

countryDict = savedCountries.reduce([CountryCD: Set<CityCD>]())  [$1: $1.cities as? Set<CityCD> ?? [] ] 

filteredCountryDict = [:]
tableView.reloadData()

numberOfSections:

return isFiltering ? filteredCountryDict.count : countryDict.count

numberOfRowsInSection:

return isFiltering ? Array(filteredCountryDict)[section].value.count : 
                     Array(countryDict)[section].value.count

cellForRowAt:

let dictionary =  .isFiltering ?
            Array(filteredCountryDict)[indexPath.section] :
            Array(countryDict)[indexPath.section]
        
let cities = (dictionary as NSSet).allObjects as? [CityCD]
cell.textLabel?.text = cities?[indexPath.row].title

filtering:

let text = searchingText?.lowercased()
    .trimmingCharacters(in: .whitespacesAndNewlines) ?? ""

isFiltering = !(text == "")

if isFiltering 
    countryDict.forEach  (key, value) in
        self.filteredCountryDict[key] = value.filter($0.title?.lowercased().contains(text) ?? false)
    
else
    filteredCountryDict.removeAll()


tableView.reloadData()

希望有用

【讨论】:

以上是关于tableView中过滤coredata模型的主要内容,如果未能解决你的问题,请参考以下文章

在 coreData 中获取一对多关系并放入 tableview

如何使用 coreData 过滤数据

NSPredicate 过滤嵌套的 CoreData 模型

在 tableView 中显示过滤数组中的数据

CoreData 与 tableView 部分

Swift UITableView 删除行项 - tableview 数据源是 Core Data