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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:10:30