【发布时间】:2021-09-28 18:41:27
【问题描述】:
努力在 swiftui 中建立并运行一个简单的示例:
- 加载默认列表视图(工作)
- 点击按钮启动选择器/过滤选项(工作)
- 选择选项,然后单击按钮以关闭并使用所选选项调用函数(调用正常)
- 显示调用返回的新对象列表(不工作)
我被困在#4,返回的查询没有进入视图。我怀疑我在第 3 步中进行调用时创建了一个不同的实例,但这对我来说在哪里/如何/为什么重要。
我尝试将代码简化一些,但还是有点,抱歉。
感谢任何帮助!
带有 HStack 的主视图和用于过滤的按钮:
import SwiftUI
import FirebaseFirestore
struct TestView: View {
@ObservedObject var query = Query()
@State var showMonPicker = false
@State var monFilter = "filter"
var body: some View {
VStack {
HStack(alignment: .center) {
Text("Monday")
Spacer()
Button(action: {
self.showMonPicker.toggle()
}, label: {
Text("\(monFilter)")
})
}
.padding()
ScrollView(.horizontal) {
LazyHStack(spacing: 35) {
ForEach(query.queriedList) { menuItems in
MenuItemView(menuItem: menuItems)
}
}
}
}
.sheet(isPresented: $showMonPicker, onDismiss: {
//optional function when picker dismissed
}, content: {
CuisineTypePicker(selectedCuisineType: $monFilter)
})
}
}
Query() 文件调用包含所有结果的基本查询,以及返回特定结果的可选函数:
import Foundation
import FirebaseFirestore
class Query: ObservableObject {
@Published var queriedList: [MenuItem] = []
init() {
baseQuery()
}
func baseQuery() {
let queryRef = Firestore.firestore().collection("menuItems").limit(to: 50)
queryRef
.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
self.queriedList = querySnapshot?.documents.compactMap { document in
try? document.data(as: MenuItem.self)
} ?? []
}
}
}
func filteredQuery(category: String?, glutenFree: Bool?) {
var filtered = Firestore.firestore().collection("menuItems").limit(to: 50)
// Sorting and Filtering Data
if let category = category, !category.isEmpty {
filtered = filtered.whereField("cuisineType", isEqualTo: category)
}
if let glutenFree = glutenFree, !glutenFree {
filtered = filtered.whereField("glutenFree", isEqualTo: true)
}
filtered
.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
self.queriedList = querySnapshot?.documents.compactMap { document in
try? document.data(as: MenuItem.self);
} ?? []
print(self.queriedList.count)
}
}
}
}
我调用过滤查询的选择器视图:
import SwiftUI
struct CuisineTypePicker: View {
@State private var cuisineTypes = ["filter", "American", "Chinese", "French"]
@Environment(\.presentationMode) var presentationMode
@Binding var selectedCuisineType: String
@State var gfSelected = false
let query = Query()
var body: some View {
VStack(alignment: .center) {
//Buttons and formatting code removed to simplify..
}
.padding(.top)
Picker("", selection: $selectedCuisineType) {
ForEach(cuisineTypes, id: \.self) {
Text($0)
}
}
Spacer()
Button(action: {
self.query.filteredQuery(category: selectedCuisineType, glutenFree: gfSelected)
self.presentationMode.wrappedValue.dismiss()
}, label: {
Text( "apply filters")
})
}
.padding()
}
}
【问题讨论】:
-
我对“应用过滤器”按钮有点困惑。在内部,您在
query上执行filteredQuery,它没有被注释为@ObservedObject或@StateObject。然后,它关闭演示模式,因此视图将消失,因此Query的实例将永远不会被读取。也许问题在于您的意思是在TestView和CuisineTypePicker之间使用Query的相同实例,但实际上并没有在两者之间共享它? -
@jnpdx 是的!这听起来像我的想法,但我无法理解,我看到你在下面发布了一个解决方案,我会深入研究。感谢您的帮助!