ios - 查看协调者/委托(delegate)消失功能?

标签 ios swift swiftui

当 View 消失时, View 协调器/委托(delegate)是否有函数?

我正在尝试创建一个 TextView ,“自动保存”记录人们输入的核心数据。基本上,自上次 textViewDidChange 后,它只等待 2 秒,然后保存数据。

它使用一个简单的 bool 变量作为“队列”,以确保它不会在 2 秒内尝试多次保存。

这是代码:

struct BodyTextView: UIViewRepresentable {
    @Environment(\.managedObjectContext) var managedObjectContext
    @Binding var text: String
    var note: Note

    func makeUIView(context: Context) -> UITextView {
        let textView = UITextView()
        textView.delegate = context.coordinator
        return textView
    }

    func updateUIView(_ textView: UITextView, context: Context) {
        textView.text = text
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator : NSObject, UITextViewDelegate {
        var textView: BodyTextView
        var saveQueued: Bool = false

        init(_ textView: BodyTextView) {
            self.textView = textView
        }

        func textViewDidChange(_ textView: UITextView) {
            self.textView.text = textView.text

            if (!saveQueued) {
                saveQueued = true

                Timer.scheduledTimer(withTimeInterval: 2, repeats: false) {_ in
                    print("saving from textViewDidChange: " + textView.text)
                    self.textView.note.body = textView.text
                    saveContext(self.textView.managedObjectContext)
                    self.saveQueued = false
                }
            }
        }
    }
}

到目前为止效果很好。

我的问题是,如果 View 在 2 秒结束之前消失,它不会保存数据。我猜这是因为当 View 被关闭时,它会取消结构内的计时器。

我希望它在 BodyTextView 消失时也能保存。

像这样:

func textViewDidDissapear(_ textView: UITextView) {
    print("saving from textViewDidDissapear: " + textView.text)
    self.textView.note.body = textView.text
    saveContext(self.textView.managedObjectContext)
}

我该怎么做?

最佳答案

SwiftUI.View 的生命周期方法是 View 本身的修饰符。因此,如果您想知道 View 何时消失,请添加 . onDisappear()对其进行修改。

关于ios - 查看协调者/委托(delegate)消失功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58924248/

相关文章:

ios - UINavigationControllerDelegate 不起作用

ios - 当我长按 UITableView 自定义标题单元格时应用程序崩溃

ios - SwiftUI Canvas 预览为一个 View 显示多个 View

ios - 将点击事件从 UIView 转发到内部 TextField

ios - 使用 SpriteView 从 SwiftUI 暂停 SpriteKit 场景(isPaused :), 而无需每次都重新初始化?

ios - SwiftUI 不同 View 之间的导航

使用 Sqlite 和 GRDB 的 SwiftUI FileDocument

ios - LLDB 使用 xcpretty 启动 xcodebuild

ios - 从 Firebase 打印数据

ios - 当应用程序运行时,本地通知不会弹出,但当应用程序处于后台时,本地通知会弹出