iOS笔记应用TextView内容无法保存问题求助
问题解决思路
你的核心问题是TextView的内容修改后没有同步到数据源数组,也没有触发保存,导致返回再进入时内容丢失。以下是具体修复步骤:
1. 给NoteViewController添加内容回传机制
修改NoteViewController,添加闭包用于传递修改后的笔记内容,同时完善保存逻辑:
class NoteViewController: UIViewController, UITextViewDelegate { @IBOutlet var textView: UITextView! var bodyText: String? var titleText: String? // 新增闭包,用于回传修改后的内容 var onSave: ((String) -> Void)? override func viewDidLoad() { super.viewDidLoad() navigationItem.rightBarButtonItem = UIBarButtonItem(image: .checkmark, style: .plain, target: self, action: #selector(saveNote)) title = titleText textView.text = bodyText textView.delegate = self } @objc func saveNote() { guard let newBody = textView.text else { return } // 通过闭包把新内容传回列表控制器 onSave?(newBody) navigationController?.popViewController(animated: true) } // 可选:离开页面时自动保存,避免用户未点击保存按钮丢失内容 override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) saveNote() } }
2. 在列表控制器中接收回传内容并更新数据源
修改didSelectRowAt方法,设置NoteViewController的闭包,更新对应笔记的内容并保存:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if let vc = storyboard?.instantiateViewController(withIdentifier: "Note") as? NoteViewController { let selectedNote = note[indexPath.row] vc.bodyText = selectedNote.body vc.titleText = selectedNote.title // 设置保存闭包,更新数据源并保存 vc.onSave = { [weak self] newBody in guard let self = self else { return } self.note[indexPath.row].body = newBody self.save() self.tableView.reloadRows(at: [indexPath], with: .automatic) } navigationController?.pushViewController(vc, animated: true) if selectedNote.title == "New note" { let ac = UIAlertController(title: "Rename note", message: "Please enter name for a new note", preferredStyle: .alert) ac.addTextField() ac.addAction(UIAlertAction(title: "Cancel", style: .default)) ac.addAction(UIAlertAction(title: "Rename", style: .default) { [unowned self, ac] _ in let newName = ac.textFields![0] self.note[indexPath.row].title = newName.text! self.tableView.reloadData() self.save() // 更新详情页的标题 vc.title = newName.text }) present(ac, animated: true) } } }
3. 确认Note模型的Codable实现正确
确保你的Note结构体/类正确实现Codable,包含title和body字段:
struct Note: Codable { var title: String var body: String }
关键修复点说明
- 之前的代码仅将初始body传递给详情页,但修改后的内容从未传回列表控制器,导致数据源数组始终未更新
- 新增闭包
onSave后,详情页能把修改后的TextView内容同步回列表,更新note数组中对应项的body字段,再调用save()持久化到UserDefaults - 新增
viewWillDisappear自动保存逻辑,避免用户忘记点击保存按钮导致内容丢失
内容的提问来源于stack exchange,提问作者Oliwier Kasprzak
相关产品推荐
相关产品推荐

