SwiftUI-检索数据后导航到视图

SwiftUI-检索数据后导航到视图,swiftui,swiftui-navigationlink,Swiftui,Swiftui Navigationlink,所以我正在从FireStore检索数据。我正在成功检索数据。当我第一次下载数据并按下新视图时,点击搜索按钮。结果,我得到了一个空白视图。但当我返回时,再次点击搜索,我肯定可以看到我的数据被呈现出来 如何确保我首先拥有正在搜索的数据,然后导航到新视图?我使用了@State变量等,但似乎没有任何效果。我使用的是MVVM方法 我的ViewModel: class SearchPostsViewModel: ObservableObject { var post: [PostModel] = [

所以我正在从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())
                    }

您应该查看苹果的文档,了解
@State
observateObject

您的问题是在非UI类/
视图
中使用
@状态

如果您从Apple SwiftUI教程开始学习,可能会有所帮助。因此,您了解了包装的不同之处,并了解了它们之间的联系


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

您应该查看苹果的文档,了解
@State
observeObject

您的问题是在非UI类/
视图
中使用
@状态

如果您从Apple SwiftUI教程开始学习,可能会有所帮助。因此,您了解了包装的不同之处,并了解了它们之间的联系


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

尝试以下修改的视图模型

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()
           }
        }
    }
}
类SearchPostsViewModel:observeObject{
@已发布的var post:[PostModel]=[]//Void,onError:@escaping(\uErrorMessage:String)->Void){
isLoading=true
searchHousesForSale(propertyStatus:propertyStatus,propertyType:propertyType,location:location,noobathrooms:noobathroomsvalue,noobbedrooms:noobbedroomsvalue,price:Int(price!){(Post)in
DispatchQueue.main.async{

self.post=post/尝试以下修改的视图模型

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()
           }
        }
    }
}
类SearchPostsViewModel:observeObject{
@已发布的var post:[PostModel]=[]//Void,onError:@escaping(\uErrorMessage:String)->Void){
isLoading=true
searchHousesForSale(propertyStatus:propertyStatus,propertyType:propertyType,location:location,noobathrooms:noobathroomsvalue,noobbedrooms:noobbedroomsvalue,price:Int(price!){(Post)in
DispatchQueue.main.async{

self.post=post//一些细节会很好!有关规则,请参阅。@CranialDev我更新了我的问题!希望这有帮助。一些细节会很好!有关规则,请参阅。@CranialDev我更新了我的问题!希望这有帮助。是的,我终于排序了。我需要在使用NavigationLink时使用isActive参数。并切换bool完成处理程序中的值。是的,我终于排序了。我需要在使用NavigationLink时使用isActive参数。并在完成处理程序中切换bool值。