String 使用SwiftUI在UserDefaults中保存文本字段中的字符串

String 使用SwiftUI在UserDefaults中保存文本字段中的字符串,string,textfield,swiftui,userdefaults,String,Textfield,Swiftui,Userdefaults,如何使用SwiftUI将文本字段中的字符串存储在用户默认值中 我已经看过关于如何在UserDefaults中保存切换状态的教程,这看起来很有希望,但我不知道如何使用相同的想法来存储文本字段中的内容: 我仍然希望能够通过在TextField中键入新文本来更新字符串,但除非我这样做,否则我希望在视图中维护字符串。更改页面和完全退出应用程序时。您可以按此处所述创建自定义绑定,并在设置文本绑定时调用UserDefaults.standard.set struct ContentView: View {

如何使用SwiftUI将文本字段中的字符串存储在用户默认值中

我已经看过关于如何在UserDefaults中保存切换状态的教程,这看起来很有希望,但我不知道如何使用相同的想法来存储文本字段中的内容:


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

您可以按此处所述创建自定义绑定,并在设置文本绑定时调用
UserDefaults.standard.set

struct ContentView: View {
    @State var location: String = ""

    var body: some View {
        let binding = Binding<String>(get: {
            self.location
        }, set: {
            self.location = $0
            // Save to UserDefaults here...
        })

        return VStack {
            Text("Current location: \(location)")
            TextField("Search Location", text: binding)
        }

    }
}
struct ContentView:View{
@状态变量位置:String=“”
var body:一些观点{
let binding=binding(获取:{
自我定位
},集:{
self.location=$0
//在此处保存为用户默认值。。。
})
返回VStack{
文本(“当前位置:\(位置)”)
TextField(“搜索位置”,文本:绑定)
}
}
}

您可以按此处所述创建自定义绑定,并在设置文本绑定时调用
UserDefaults.standard.set

struct ContentView: View {
    @State var location: String = ""

    var body: some View {
        let binding = Binding<String>(get: {
            self.location
        }, set: {
            self.location = $0
            // Save to UserDefaults here...
        })

        return VStack {
            Text("Current location: \(location)")
            TextField("Search Location", text: binding)
        }

    }
}
struct ContentView:View{
@状态变量位置:String=“”
var body:一些观点{
let binding=binding(获取:{
自我定位
},集:{
self.location=$0
//在此处保存为用户默认值。。。
})
返回VStack{
文本(“当前位置:\(位置)”)
TextField(“搜索位置”,文本:绑定)
}
}
}

对于此类内容,我建议您使用
.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
出版商文档中说:

当您希望在传递过程中等待暂停时,请使用此运算符 来自上游发布服务器的事件。例如,在屏幕上调用debounce publisher从文本字段中删除,仅在用户 暂停或停止打字。当他们再次开始打字时,去盎司 将事件传递保持到下一次暂停


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

对于此类事件,我建议您使用
.debounce
publisher

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
出版商文档中说:

当您希望在传递过程中等待暂停时,请使用此运算符 来自上游发布服务器的事件。例如,在屏幕上调用debounce publisher从文本字段中删除,仅在用户 暂停或停止打字。当他们再次开始打字时,去盎司 将事件传递保持到下一次暂停


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

欢迎使用StackOverflow。请展示您进行了哪些研究,您已经尝试了哪些,哪些不起作用,代码示例等。阅读并更新您的问题。查看我的解决方案有一个到YouTube示例的链接欢迎来到StackOverflow。请展示你所做的研究,你已经尝试过的,没有成功的,代码示例等。阅读并更新你的问题。看看我的解决方案,有一个链接到YouTube示例,请不要只发布链接答案。虽然它们可能是正确的,但如果链接发生更改/关闭,您答案的完整性将受到损害。请尝试在您的答案中包含此链接的重要部分。谢谢您的回复!我现在的问题是,在写“保存到UserDefaults here…”的地方写什么。这是我感到困惑的部分。我希望文本字段中的输入数据保留在视图中,即使在关闭应用程序后也是如此。请不要只发布链接答案。虽然它们可能是正确的,但如果链接发生更改/关闭,您答案的完整性将受到损害。请尝试在您的答案中包含此链接的重要部分。谢谢您的回复!我现在的问题是,在写“保存到UserDefaults here…”的地方写什么。这是我感到困惑的部分。我希望文本字段中的输入数据即使在关闭应用程序后仍保留在视图中。感谢您的评论!我已经测试了代码,但是我仍然存在当应用程序重新启动时用户输入被删除的问题。保存到UserDefaults应该可以,因为此应用程序的输入将每周发生一次或更少,因此数据负载不应该太重。如果可能的话,我仍然希望得到比保存到UserDefaults更好的解决方案,因为我对SwiftUI编码还不熟悉。@oscar我编辑了我的答案,以便您的用户在应用程序启动时看到他/她以前键入的文本。这只是阅读您以前保存的用户默认值的问题。谢谢