存储选择器中的选定值以在其他视图中使用 - SwiftUI
Storing a selected value from picker to use in other views - SwiftUI
我得到了非常友好的帮助,允许我的选择器 select 来自我的 Firestore 数据库的值。我想做的是,一旦该值在我的选择器中被 selected,我希望能够在其他视图中显示该值。我已经尝试使用 UserDefaults 进行设置,但我不确定这是要走的路吗?如果您能提出更好的方法,我将不胜感激。我的代码目前在下面。
以下代码中的值 returns 未知学校每次都在没有用户默认值的情况下完美地获取数据。
提前致谢。
import SwiftUI
import Firebase
struct SchoolDetailsView: View {
@ObservedObject var schoolData = getSchoolData()
@State private var selectedSchool = UserDefaults.standard.string(forKey: "") // `schoolName.id` is of type String
var body: some View {
VStack {
Form {
Section {
Picker(selection: $selectedSchool, label: Text("School Name")) {
ForEach(schoolData.datas, id: \.id) {
Text([=10=].name)
}
}
Text("Selected School: \(selectedSchool ?? "Unknown School")")
}
}.navigationBarTitle("School Selection")
}
}
struct SchoolPicker_Previews: PreviewProvider {
static var previews: some View {
SchoolDetailsView()
}
}
class getSchoolData : ObservableObject{
@Published var datas = [schoolName]()
init() {
let db = Firestore.firestore()
db.collection("School Name").addSnapshotListener { (snap, err) in
if err != nil{
print((err?.localizedDescription)!)
return
}
for i in snap!.documentChanges{
let id = i.document.documentID
let name = i.document.get("Name") as! String
self.datas.append(schoolName(id: id, name: name))
}
}
}
}
struct schoolName : Identifiable {
var id : String
var name : String
}
}
首先,变量的 UserDefaults 键不能为空:
@State private var selectedSchool: String = UserDefaults.standard.string(forKey: "selectedSchool") ?? "Unknown School"
然后可以使用onReceive
更新变量:
.onReceive(Just(selectedSchool)) {
UserDefaults.standard.set([=11=], forKey: "selectedSchool")
}
完整代码:
import Combine
import Firebase
import SwiftUI
struct SchoolDetailsView: View {
@ObservedObject var schoolData = getSchoolData()
@State private var selectedSchool = UserDefaults.standard.string(forKey: "selectedSchool")
var body: some View {
VStack {
Form {
Section {
Picker(selection: $selectedSchool, label: Text("School Name")) {
ForEach(schoolData.datas, id: \.id) {
Text([=12=].name)
}
}
.onReceive(Just(selectedSchool)) {
UserDefaults.standard.set([=12=], forKey: "selectedSchool")
}
Text("Selected School: \(selectedSchool)")
}
}.navigationBarTitle("School Selection")
}
}
}
请注意,在 SwiftUI 2 / iOS 14 中,您可以改用 。
我得到了非常友好的帮助,允许我的选择器 select 来自我的 Firestore 数据库的值。我想做的是,一旦该值在我的选择器中被 selected,我希望能够在其他视图中显示该值。我已经尝试使用 UserDefaults 进行设置,但我不确定这是要走的路吗?如果您能提出更好的方法,我将不胜感激。我的代码目前在下面。
以下代码中的值 returns 未知学校每次都在没有用户默认值的情况下完美地获取数据。
提前致谢。
import SwiftUI
import Firebase
struct SchoolDetailsView: View {
@ObservedObject var schoolData = getSchoolData()
@State private var selectedSchool = UserDefaults.standard.string(forKey: "") // `schoolName.id` is of type String
var body: some View {
VStack {
Form {
Section {
Picker(selection: $selectedSchool, label: Text("School Name")) {
ForEach(schoolData.datas, id: \.id) {
Text([=10=].name)
}
}
Text("Selected School: \(selectedSchool ?? "Unknown School")")
}
}.navigationBarTitle("School Selection")
}
}
struct SchoolPicker_Previews: PreviewProvider {
static var previews: some View {
SchoolDetailsView()
}
}
class getSchoolData : ObservableObject{
@Published var datas = [schoolName]()
init() {
let db = Firestore.firestore()
db.collection("School Name").addSnapshotListener { (snap, err) in
if err != nil{
print((err?.localizedDescription)!)
return
}
for i in snap!.documentChanges{
let id = i.document.documentID
let name = i.document.get("Name") as! String
self.datas.append(schoolName(id: id, name: name))
}
}
}
}
struct schoolName : Identifiable {
var id : String
var name : String
}
}
首先,变量的 UserDefaults 键不能为空:
@State private var selectedSchool: String = UserDefaults.standard.string(forKey: "selectedSchool") ?? "Unknown School"
然后可以使用onReceive
更新变量:
.onReceive(Just(selectedSchool)) {
UserDefaults.standard.set([=11=], forKey: "selectedSchool")
}
完整代码:
import Combine
import Firebase
import SwiftUI
struct SchoolDetailsView: View {
@ObservedObject var schoolData = getSchoolData()
@State private var selectedSchool = UserDefaults.standard.string(forKey: "selectedSchool")
var body: some View {
VStack {
Form {
Section {
Picker(selection: $selectedSchool, label: Text("School Name")) {
ForEach(schoolData.datas, id: \.id) {
Text([=12=].name)
}
}
.onReceive(Just(selectedSchool)) {
UserDefaults.standard.set([=12=], forKey: "selectedSchool")
}
Text("Selected School: \(selectedSchool)")
}
}.navigationBarTitle("School Selection")
}
}
}
请注意,在 SwiftUI 2 / iOS 14 中,您可以改用