SwiftUI-检索数据后导航查看

时间:2020-08-16 23:18:58

标签: swiftui swiftui-navigationlink

因此,我正在从FireStore检索数据。我正在成功检索数据。当我第一次点击搜索按钮时,将下载数据并推送新视图。结果,我得到一个空白视图。但是当我返回时,再次点击搜索,可以肯定地看到了我的数据。

如何确保我首先拥有要搜索的数据,然后导航到新视图?我使用了@State变量等。但是似乎没有任何效果。我正在使用MVVM方法。

我的ViewModel:

class SearchPostsViewModel: ObservableObject {
    var post: [PostModel] = []
 @State var searchCompleted: Bool = false
    func searchPosts(completed: @escaping() -> Void, onError: @escaping(_ errorMessage: String) -> Void) {
            isLoading = true
        API.Post.searchHousesForSale(propertyStatus: propertyStatus, propertyType: propertyType, location: location, noOfBathrooms: noOfBathroomsValue, noOfBedrooms: noOfBedroomsValue, price: Int(price!)) { (post) in
            self.post = post
            print(self.post.count)
            self.isLoading = false
            self.searchCompleted.toggle()
        }
    

    }
    
}

有效但有错误的代码:

                    NavigationLink(destination: FilterSearchResults(searchViewModel: self.searchPostsViewModel)
                        .onAppear(perform: {
                            DispatchQueue.main.async {
                                self.createUserRequest()
                            }
                        })
                        )
                      {
                        Text("Search").modifier(UploadButtonModifier())
                    }

2 个答案:

答案 0 :(得分:0)

您应该查看@StateObservableObject的Apple文档

https://developer.apple.com/documentation/combine/observableobject

https://developer.apple.com/documentation/swiftui/state

您的问题是在非UI类/ @State中使用View

如果您从Apple SwiftUI教程开始可能会有所帮助。因此,您了解了包装器的区别,并了解了包装器之间的连接方式。

https://developer.apple.com/tutorials/swiftui

此外,当您发布问题时,请确保您的代码可以原样复制并粘贴到Xcode上,以便人们可以对其进行测试。如果其他开发人员可以看到实际情况,您将获得更好的反馈。随着您的进步,发现问题将变得不那么容易。

答案 1 :(得分:0)

尝试使用以下修改后的视图模型

class SearchPostsViewModel: ObservableObject {
    @Published var post: [PostModel] = []         // << make both published
    @Published var searchCompleted: Bool = false

    func searchPosts(completed: @escaping() -> Void, onError: @escaping(_ errorMessage: String) -> Void) {
            isLoading = true
        API.Post.searchHousesForSale(propertyStatus: propertyStatus, propertyType: propertyType, location: location, noOfBathrooms: noOfBathroomsValue, noOfBedrooms: noOfBedroomsValue, price: Int(price!)) { (post) in
            DispatchQueue.main.async {
               self.post = post           // << update on main queue
               print(self.post.count)
               self.isLoading = false
               self.searchCompleted.toggle()
           }
        }
    }
}