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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:41:33