TableView多TextView独立保存问题求助(UserDefaults实现)
问题分析与解决方案
你的核心问题是所有笔记共用同一个UserDefaults存储键noteText,导致每次保存都会覆盖所有笔记的内容。另外DetailViewController中创建新ViewController实例的操作完全多余,属于无效代码。
具体修改步骤
1. 修正DetailViewController的存储与读取逻辑
把存储键改成和选中的笔记名称绑定的唯一值,确保每个笔记有独立的存储入口:
import UIKit class DetailViewController: UIViewController { @IBOutlet var textView: UITextView! var selectedNote: String? override func viewDidLoad() { super.viewDidLoad() // 移除无效的ViewController实例创建和notesTwo数组 textView.font = UIFont(name: "Helvetica-Bold", size: 18) // 根据选中的笔记名称读取对应内容 guard let noteName = selectedNote else { return } let defaults = UserDefaults.standard let key = "note_content_\(noteName)" textView.text = defaults.string(forKey: key) ?? "" } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // 根据选中的笔记名称保存对应内容 guard let noteName = selectedNote, let noteText = textView.text else { return } let defaults = UserDefaults.standard let key = "note_content_\(noteName)" defaults.set(noteText, forKey: key) } }
2. 主ViewController可选优化(非必须)
如果需要在列表中显示笔记内容的预览,可以修改cellForRowAt方法,读取对应笔记的存储内容:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) let noteName = notes[indexPath.row] cell.textLabel?.text = noteName // 可选:添加内容预览 let defaults = UserDefaults.standard let previewText = defaults.string(forKey: "note_content_\(noteName)") ?? "无内容" cell.detailTextLabel?.text = previewText return cell }
关键说明
- 用
note_content_\(noteName)作为存储键,每个笔记的名称(如Note1、Note2)会生成唯一的键,彻底避免覆盖问题。 - 移除
DetailViewController中let otherVC = ViewController()的代码:创建新的ViewController实例无法获取原页面的笔记数据,完全是无效操作,因为selectedNote已经通过跳转前的赋值传递过来了。 - 读取时使用
?? ""确保TextView默认显示空字符串,避免nil导致的空白问题。
内容的提问来源于stack exchange,提问作者A A
相关产品推荐
相关产品推荐

