首页 > 解决方案 > 查看协调员/代表消失功能?

问题描述

当视图消失时,视图协调器/委托是否有功能?

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

它为“队列”使用了一个简单的布尔变量,以确保它不会在这 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
                }
            }
        }
    }
}

到目前为止,这运作良好。

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

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

像这样的东西:

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

我该怎么做呢?

标签: iosswiftswiftui

解决方案


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


推荐阅读