gpt4 book ai didi

string - 使用 SwiftUI 在 UserDefaults 中保存来自 TextField 的字符串

转载 作者:行者123 更新时间:2023-12-05 09:12:31 26 4
gpt4 key购买 nike

如何使用 SwiftUI 将来自 TextField 的字符串存储在 UserDefaults 中?

我看过关于如何在 UserDefaults 中保存切换状态的教程,看起来很有希望,但我无法弄清楚如何使用相同的想法来存储 TextField 中的内容:https://www.youtube.com/watch?v=nV-OdfQhStM&list=PLerlU8xuZ7Fk9zRMuh7JCKy1eOtdxSBut&index=3&t=329s

我仍然希望能够通过在 TextField 中键入新文本来更新字符串,但除非我这样做,否则我希望在 View 中保留该字符串。更改页面和完全退出应用程序时。

最佳答案

对于此类情况,我建议您使用 .debounce 发布器。

import SwiftUI
import Combine

class TestViewModel : ObservableObject {
private static let userDefaultTextKey = "textKey"
@Published var text = UserDefaults.standard.string(forKey: TestViewModel.userDefaultTextKey) ?? ""
private var canc: AnyCancellable!

init() {
canc = $text.debounce(for: 0.2, scheduler: DispatchQueue.main).sink { newText in
UserDefaults.standard.set(newText, forKey: TestViewModel.userDefaultTextKey)
}
}

deinit {
canc.cancel()
}
}

struct ContentView: View {
@ObservedObject var viewModel = TestViewModel()

var body: some View {
TextField("Type something...", text: $viewModel.text)
}
}

.debounce 发布者文档说:

Use this operator when you want to wait for a pause in the delivery of events from the upstream publisher. For example, call debounce on the publisher from a text field to only receive elements when the user pauses or stops typing. When they start typing again, the debounce holds event delivery until the next pause.

您真的不想将文本保存在 UserDefaults 每次 用户键入内容时(即他/她键入的每个字符)。您只想将文本最终保存到 UserDefaults。 debounce 发布者根据你在 debounce init 中设置的时间(在上面的例子中是 0.2 秒)等待用户停止输入,然后将事件转发给实际保存文本的 sink 订阅者。当你有很多事件(例如在文本字段中键入新文本)可能触发“繁重”操作(无论你能想到什么:与 CoreData、网络调用等相关的东西)时,请始终使用 debounce publisher。

关于string - 使用 SwiftUI 在 UserDefaults 中保存来自 TextField 的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58039402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com