无论我尝试什么,当@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
时,它显示正确的数据。但是视图没有更新。>
答案 0 :(得分:1)
这个DownloadController
@StateObject var vm: DownloadController = DownloadController()
与此不同
DownloadController().getProjectsByUserTokenCompletion
这在onAppear
DownloadController().getProjectsByUserTokenCompletion
一个人看不到另一个人在做什么
每次调用 DownloadController()
时都会创建一个不同的实例
更改 DownloadController()
的任何调用(@StateObject
除外)以使用 vm
变量
vm.getProjectsByUserTokenCompletion