You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:18:32