将文本从 UITextView 保存到领域(Swift 5)时出现问题

Posted

技术标签:

【中文标题】将文本从 UITextView 保存到领域(Swift 5)时出现问题【英文标题】:Problem saving text from UITextView into Realm (Swift 5) 【发布时间】:2020-04-05 19:08:14 【问题描述】:

试图将用户的 textView.text 保存到 Realm 中。想如果我将我的保存函数调用到 textFieldDidEndEditing 函数中,它会触发我的领域数据库来保存它。函数运行正常(结束编辑时打印“已成功保存”),但是当我关闭并返回时,没有任何数据。

import UIKit
import RealmSwift

class NoteViewController: UIViewController, UITextViewDelegate 

    var textView = UITextView()
    var notes: Results<Notes>?
    let realm = try! Realm()

    var selectedNote: Menu? 
        didSet 
           loadNotes()
        
    

    @IBOutlet weak var theTextView: UITextView!
    override func viewDidLoad() 
        super.viewDidLoad()

        loadNotes()

        self.textView.delegate = self

    

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
        self.view.endEditing(true)
    

    override func viewDidDisappear(_ animated: Bool) 
        saveNote()
    




    func textViewDidBeginEditing(_ textView: UITextView) 

    

    func textViewDidEndEditing(_ textView: UITextView) 

     saveNote()
    



   //MARK: - Data Manipulation

    func loadNotes() 
        notes = realm.objects(Notes.self)

        textView.reloadInputViews()


    

    func saveNote() 
        if let currentNote = self.selectedNote 
                 do 
                     try self.realm.write 
                         let newNote = Notes()
                         newNote.body = theTextView.text!
                         newNote.dateCreated = Date()
                         currentNote.notes.append(newNote)
                        print("Saved successfully")
                     
                  catch 
                     print("Error saving note body, with \(error)")
                 
             


    




Realm File: 

class Notes: Object 
    @objc dynamic var body: String = ""
    @objc dynamic var dateCreated: Date?
    var parent = LinkingObjects(fromType: Menu.self, property: "notes")



Menu Realm File:

class Menu: Object 
    @objc dynamic var name: String = ""
    @objc dynamic var preview: String = ""

    let notes = List<Notes>()

 '''

【问题讨论】:

我有几个问题要问你。您的 Menu 对象是否已由领域管理?还是还需要保存到领域?你的 NoteViewController 是用来编辑和创建笔记的吗?尽可能多地发布代码。至少,查看您的 Menu 类定义、您在 textView 中加载的内容以及如何使用文本加载 textView 会有所帮助。 没有任何数据是什么意思?您是否使用 Realm Studio 并检查数据库以查看它是否实际保存?此外,selectedNote 似乎是一个菜单var selectedNote: Menu?,对吗?那个 var 设置在哪里? 谢谢大家。刚刚将 Menu 类添加到上面的代码中。我确实在 Studio 中检查了领域文件 - 它保存了菜单数据和笔记类的 dateCreated 就好了,但不是笔记的正文。 这告诉我theTextView.text! 是一个空字符串。 【参考方案1】:

您似乎正在使用故事板来创建布局。

然后摆脱var textView = UITextView()textView.reloadInputViews()

在 viewDidLoad() 中将 self.textView.delegate = self 替换为 theTextView.delegate = self

要检查TextView的内容修改你的打印语句:

print("Saved successfully: \(theTextView.text!)")

如果在“已成功保存:”之后没有立即打印文本,则检查 TextView 的界面构建器:验证 theTextView 的出口,这实际上是您正在使用的 UITextView(因为您的应用确实打印了一些看起来像以某种方式连接,否则它会在newNote.body = theTextView.text! 中崩溃。

我想你也忘了用 notes.body 实际初始化 theTextView。 尝试像这样修改 loadNotes():

func loadNotes() 
    notes = realm.objects(Notes.self)

    theTextView.text = notes.body

【讨论】:

以上是关于将文本从 UITextView 保存到领域(Swift 5)时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

将 UITextView 中的文本保存到 NSUserDefaults 中的方式与将 UITextFIeld 保存在 Notes 应用程序中的方式相同

从UITextView创建PDF

添加文本和禁用滚动时如何使 UITextView 字段扩展?

如何将触摸从 UITextView 传递到 UITableViewCell

UITextView高度调整

以编程方式将文本插入 UITextView 而不移动插入符号位置。