当@published 更改时,Swift 不会更新视图

时间:2021-05-01 16:36:20

标签: swift

无论我尝试什么,当@published 更改时,Swift 似乎都不会更新视图。

我在视图中有以下代码

查看

@StateObject var vm: DownloadController = DownloadController() // I also tried ObeservedObject or State but it doesn't seem to matter.

VStack {
        HStack {
            Image("logo_color")
                .resizable()
                .scaledToFit()
                .frame(width: 250, height: 105, alignment: .leading)
            
            Button(action: { self.showModal = true } , label: {
                Text("Help")
                    .foregroundColor(.orange)
            })
            .frame(maxWidth: .infinity, alignment: .trailing)
            
        }
        .padding(.top, 20)
        .padding(.horizontal)
        
        RefreshableScrollView(onRefresh: { done in
            DispatchQueue.main.asyncAfter(deadline: .now()) {
                //vm.project.removeAll();
                
                DownloadController().getProjectsByUserTokenCompletion  {
                    //vm.project = viewModel.project
                }
                
                print(vm.project)
                
                done()
            }
        }) {
            VStack {
                let project_count = vm.project.count
                
                if (project_count > 0) {
                    
                    ForEach((vm.project).reversed()) { project in
                        CardView(image: project.projectImage, project_title: project.projectName, project_details: project.projectDetail, project_url: project.projectUrl, status: "up")
                    }
                    
                    Text("End of the line")
                        .font(.subheadline)
                        .foregroundColor(.gray)
                        .foregroundColor(Color.black)
                    
                } else {
                    Text("Geen resultaten. Probeer het later opnieuw")
                }
            }
            .padding(.horizontal, 12)
            .padding(.bottom, 100)
        }
    }.edgesIgnoringSafeArea(.all)
    .onAppear {
        DownloadController().getProjectsByUserTokenCompletion  {
            //self.data = viewModel.project
        }
    }
    .sheet(isPresented: self.$showModal) {
        HomeHelpCard()
    }

型号

struct getProjects: Decodable {
    let Projects: [Project]
}

struct Project: Decodable, Hashable, Identifiable {
    let id: Int
    let projectName: String
    let projectDetail: String
    let projectUrl: String
    let projectImage: String
}

控制器

class DownloadController: ObservableObject {
     @Published var project = [Project]()

func getProjectsByUserTokenCompletion(finished: () -> Void) {
        let url = URL(string: "\(self.Api_URL)/api/v1/webhook/projects/\(self.Api_token)/\(self.UserToken ?? self.Default)")!
        
        var request  = URLRequest(url: url)
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        request.setValue("Bearer \(self.Token ?? "")", forHTTPHeaderField: "Authorization")

        let decoder = JSONDecoder()
        decoder.keyDecodingStrategy = .convertFromSnakeCase
        URLSession.shared.jsonDecodableTask(with: request, decoder: decoder) { (result: Result<getProjects, Error>) in
            switch result {
            
                case .success(let project):
                    self.project = project.Projects
                    
                case .failure(let error):
                    print(error)
            }
        }.resume()
        
        finished()
    }
}

然而,上述工作完美无缺,当我执行“拉动刷新”操作时,它似乎没有更新我尝试做的任何事情。通过调用 DownloadController().getProjectsByUserTokenCompletion { ... } 我尝试从数据库下载新数据(这部分当然没有记录,但它只是将一些文本从 Lorum Ipsum 更改为 Test test或者其他什么。这也有效。当我在分配了 DownloadController() 后进入 print(self.project)project.Projects 时,它显示正确的数据。但是视图没有更新。

1 个答案:

答案 0 :(得分:1)

这个DownloadController

@StateObject var vm: DownloadController = DownloadController()

与此不同

DownloadController().getProjectsByUserTokenCompletion

这在onAppear

DownloadController().getProjectsByUserTokenCompletion 

一个人看不到另一个人在做什么

每次调用 DownloadController() 时都会创建一个不同的实例

更改 DownloadController() 的任何调用(@StateObject 除外)以使用 vm 变量

vm.getProjectsByUserTokenCompletion