CoreData初始化对象后,如何让TableView仅显示PickerView选中项
解决CoreData下仅显示Picker选中项的问题
你的核心问题在于把Picker的数据源(所有公式)直接用CoreData托管对象初始化了,这些对象一创建就被CoreData上下文托管,只要保存上下文就会持久化,导致查询时会返回所有初始化的公式,自然TableView就显示全部了。我们需要把「可选公式池」和「用户选中的已保存公式」彻底分开,下面是具体的实现方案:
1. 新建普通Model类存储所有可选公式
首先创建一个非CoreData托管的结构体,用来存放你那200个工作公式,这些对象不会自动存入数据库,仅作为Picker的数据源:
import Foundation struct Formula { let formulaNumber: String let formulaTitle: String let base: String let baseValue: Double let vit: String let vitValue: Double let min: String let minValue: Double let verdNat: String let verdNatValue: Double }
2. 修改公式管理类
把原来直接初始化SavedRun的逻辑改成初始化Formula,同时添加「保存选中公式到CoreData」和「获取已保存公式」的方法:
import UIKit import CoreData class AllFormulasTest { var pickerArr: [Formula] = [] init() { // 用普通Formula结构体初始化所有可选公式,不会进入CoreData let F1354670 = Formula( formulaNumber: "F1354670", formulaTitle: "test formula title", base: "Base name", baseValue: 251.90, vit: "Vit name", vitValue: 50.38, min: "Min name", minValue: 45.34, verdNat: "Verd name", verdNatValue: 16.79 ) // 这里添加你所有200个公式到pickerArr pickerArr = [F1354670, F1354670, F1354670, F1354670, F1354670] } // 将选中的Formula转换为CoreData托管对象并保存 func saveSelectedFormula(_ formula: Formula) { // 可选:先检查是否已保存过该公式,避免重复存储 let fetchRequest: NSFetchRequest<SavedRun> = SavedRun.fetchRequest() fetchRequest.predicate = NSPredicate(format: "formulaNumber == %@", formula.formulaNumber) do { let existingRuns = try PersistenceService.context.fetch(fetchRequest) if !existingRuns.isEmpty { return // 已存在,跳过保存 } } catch { print("检查重复公式失败:\(error)") } // 创建CoreData托管对象并赋值 let savedRun = SavedRun(context: PersistenceService.context) savedRun.formulaNumber = formula.formulaNumber savedRun.formulaTitle = formula.formulaTitle savedRun.base = formula.base savedRun.baseValue = formula.baseValue savedRun.vit = formula.vit savedRun.vitValue = formula.vitValue savedRun.min = formula.min savedRun.minValue = formula.minValue savedRun.verdNat = formula.verdNat savedRun.verdNatValue = formula.verdNatValue // 保存到数据库 PersistenceService.saveContext() } // 从CoreData获取已保存的公式,供TableView使用 func fetchSavedRuns() -> [SavedRun] { let fetchRequest: NSFetchRequest<SavedRun> = SavedRun.fetchRequest() do { return try PersistenceService.context.fetch(fetchRequest) } catch { print("获取已保存公式失败:\(error)") return [] } } }
3. 在ViewController中对接Picker和TableView
Picker选中时的处理
当用户选中Picker的某一行,调用保存方法并刷新TableView:
// 初始化公式管理实例 let formulasManager = AllFormulasTest() // PickerView选中回调 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { let selectedFormula = formulasManager.pickerArr[row] formulasManager.saveSelectedFormula(selectedFormula) tableView.reloadData() // 刷新TableView展示新选中的公式 }
TableView数据源实现
TableView的内容直接从CoreData获取已保存的公式:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return formulasManager.fetchSavedRuns().count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellID", for: indexPath) let savedRun = formulasManager.fetchSavedRuns()[indexPath.row] cell.textLabel?.text = savedRun.formulaTitle ?? "无标题" // 这里可以设置其他单元格内容,比如baseValue等 return cell }
为什么这样做能解决问题?
- 普通Formula结构体仅作为Picker的数据源,不会被CoreData托管,所以初始化时不会自动存入数据库。
- 只有用户选中的公式才会被转换成CoreData的
SavedRun对象并持久化,TableView查询时只会返回这些已保存的对象。 - App重启后,TableView会重新从CoreData获取数据,之前选中的内容不会丢失。
内容的提问来源于stack exchange,提问作者Mark Rogers
相关产品推荐
相关产品推荐

