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

CoreData数据同步到CollectionViewCell配置失败及新增数据字段nil报错求助

问题1:点击addMonacemebi按钮报字段nil错误

崩溃原因是直接强制解包了textField的text属性,只要任意输入框为空就会触发强制解包失败。修复代码如下:

@IBAction func addMonacemebi(_ sender: Any) {
    // 先校验所有必填字段非空
    guard let satauri = satauriField.text, !satauri.isEmpty,
          let avtori = authorField.text, !avtori.isEmpty,
          let janri = janriField.text, !janri.isEmpty,
          let statia = statiaField.text, !statia.isEmpty else {
        // 可自定义空字段的用户提示
        let alert = UIAlertController(title: "提示", message: "请填写所有字段后提交", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "确定", style: .default))
        present(alert, animated: true)
        return
    }
    createItem(satauri: satauri, avtori: avtori, janri: janri, statia: statia)
    NotificationCenter.default.post(name: NSNotification.Name("load"), object: nil)
}

另外AddViewController里的getAllItems方法不需要保留,你在此处拉取的数据和第一个控制器的数据源没有关联,属于无效代码。

问题2:CollectionViewCell配置错误

你当前的config方法逻辑完全错误,cell无法访问第一个控制器的statiebi数组,需要把传入的CoreData模型属性赋值给cell对应的Label,修复代码如下:

class CollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var myLabel: UILabel!
    @IBOutlet weak var janri: UILabel!
    @IBOutlet weak var author: UILabel!
    @IBOutlet weak var statia: UILabel!
    
    func config(with model: StatiaList){
        // 给可选型加默认值避免显示nil
        myLabel.text = model.satauri ?? "无标题"
        janri.text = model.janri ?? "无分类"
        author.text = model.avtori ?? "无作者"
        statia.text = model.statia ?? "无内容"
    }
}

问题3:CollectionView未同步刷新

你只注册了通知监听,但没有实现监听回调方法,也没有在回调里重新拉取CoreData数据刷新列表,第一个控制器补充代码如下:

// 第一个控制器类内部定义
var statiebi = [StatiaList]()
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(loadList), name: NSNotification.Name(rawValue: "load"), object: nil)
    // 首次进入页面先拉取本地数据
    fetchData()
}

// 拉取CoreData数据并刷新列表
func fetchData() {
    do {
        statiebi = try context.fetch(StatiaList.fetchRequest())
        DispatchQueue.main.async {
            self.collectionView.reloadData()
        }
    } catch {
        print("数据拉取失败: \(error)")
    }
}

// 通知回调方法
@objc func loadList() {
    fetchData()
}

// 移除通知监听避免内存泄漏
deinit {
    NotificationCenter.default.removeObserver(self)
}

内容的提问来源于stack exchange,提问作者Bon Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:24:00