观察到的对象被无意中解雇了 SwiftUI
Observed Object gets Dismissed Unintentionally SwiftUI
我在具有以下设计的 NavigationView 中有一个 HStack:
- 用户可以滚动,然后点击 HStack 列表中的项目以查看详细信息
- 在详细视图中,用户可以select 项目
- 如果项目是 selected,我将 selected 项目的新视图放在 HStack 的顶部,因此只有 selected 项目可见
- 我想保留原始 HStack 并在新视图下方列出,以便用户可以反转流程而不丢失滚动位置
我已经使用一些测试数据完成了此操作并且它按预期工作,但是当我使用来自 Firebase 调用的数据时,原始 HStack/List 视图在新的“selected”视图时被关闭放在最上面...我不明白为什么。我认为这可能与观察对象的启动方式有关。感谢您的帮助!
struct TestView: View {
@StateObject var selectedItem = SelectedItem()
//Real Query
@ObservedObject var query = Query()
@ObservedObject var testQuery = TestQuery()
var body: some View {
VStack{
ZStack{
ScrollView(.horizontal) {
HStack(spacing: 35) {
//ForEach(query.queriedList) doesn't work, however the below does...
ForEach(testQuery.testList) { menuItems in
NavigationLink(
destination: NewDetailView(selectedItem: selectedItem, weeklyItems: weeklyItems, menuItem: menuItems)) {
MenuItemView(menuItem: menuItems)
.padding([.leading, .trailing])
}
}
}
}
//if the array is NOT empty
if selectedItem.selection.isEmpty == false {
//PUT THIS ON TOP
ScrollView(.horizontal) {
NavigationLink(
destination: NewDetailView(selectedItem: selectedItem, weeklyItems: weeklyItems, menuItem: self.selectedItem.selection[0], isSelected: true)) {
MenuItemView(menuItem: self.selectedItem.selection[0])
.padding([.leading, .trailing])
}
}
}
}
}
}
测试查询是什么样的
class TestQuery: ObservableObject {
@Published var testList: [MenuItem] = [.init(title: "Ham & Eggs", prepTime: 5, cookTime: 5, rating: 2, lastUsed: 13), .init(title: "Hot Totters", prepTime: 5, cookTime: 5, rating: 2, lastUsed: 13), .init(title: "Ranch Dressing Soup", prepTime: 5, cookTime: 5, rating: 2, lastUsed: 13)]
}
Firebase 查询
class Query: ObservableObject {
@Published var queriedList: [MenuItem] = []
init() {
baseQuery()
}
func baseQuery() {
let queryRef1 = Firestore.firestore().collection("menuItems").limit(to: 50)
print("base fired")
queryRef1
.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)
} ?? []
}
}
}
在 SwiftUI 视图中创建 ObservableObject 的唯一安全方法是使用
@StateObject
将两个 ObservedObjects 切换为 StateObjects
https://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app
我在具有以下设计的 NavigationView 中有一个 HStack:
- 用户可以滚动,然后点击 HStack 列表中的项目以查看详细信息
- 在详细视图中,用户可以select 项目
- 如果项目是 selected,我将 selected 项目的新视图放在 HStack 的顶部,因此只有 selected 项目可见
- 我想保留原始 HStack 并在新视图下方列出,以便用户可以反转流程而不丢失滚动位置
我已经使用一些测试数据完成了此操作并且它按预期工作,但是当我使用来自 Firebase 调用的数据时,原始 HStack/List 视图在新的“selected”视图时被关闭放在最上面...我不明白为什么。我认为这可能与观察对象的启动方式有关。感谢您的帮助!
struct TestView: View {
@StateObject var selectedItem = SelectedItem()
//Real Query
@ObservedObject var query = Query()
@ObservedObject var testQuery = TestQuery()
var body: some View {
VStack{
ZStack{
ScrollView(.horizontal) {
HStack(spacing: 35) {
//ForEach(query.queriedList) doesn't work, however the below does...
ForEach(testQuery.testList) { menuItems in
NavigationLink(
destination: NewDetailView(selectedItem: selectedItem, weeklyItems: weeklyItems, menuItem: menuItems)) {
MenuItemView(menuItem: menuItems)
.padding([.leading, .trailing])
}
}
}
}
//if the array is NOT empty
if selectedItem.selection.isEmpty == false {
//PUT THIS ON TOP
ScrollView(.horizontal) {
NavigationLink(
destination: NewDetailView(selectedItem: selectedItem, weeklyItems: weeklyItems, menuItem: self.selectedItem.selection[0], isSelected: true)) {
MenuItemView(menuItem: self.selectedItem.selection[0])
.padding([.leading, .trailing])
}
}
}
}
}
}
测试查询是什么样的
class TestQuery: ObservableObject {
@Published var testList: [MenuItem] = [.init(title: "Ham & Eggs", prepTime: 5, cookTime: 5, rating: 2, lastUsed: 13), .init(title: "Hot Totters", prepTime: 5, cookTime: 5, rating: 2, lastUsed: 13), .init(title: "Ranch Dressing Soup", prepTime: 5, cookTime: 5, rating: 2, lastUsed: 13)]
}
Firebase 查询
class Query: ObservableObject {
@Published var queriedList: [MenuItem] = []
init() {
baseQuery()
}
func baseQuery() {
let queryRef1 = Firestore.firestore().collection("menuItems").limit(to: 50)
print("base fired")
queryRef1
.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)
} ?? []
}
}
}
在 SwiftUI 视图中创建 ObservableObject 的唯一安全方法是使用
@StateObject
将两个 ObservedObjects 切换为 StateObjects
https://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app