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
相关产品推荐
相关产品推荐

