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 中显示过滤结果。
有人可以帮我弄清楚如何解决这个问题吗?
【问题讨论】:
let filtered = countries.filter aCountry in guard let cities = aCountry as? Set<CityCD> 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模型的主要内容,如果未能解决你的问题,请参考以下文章