我的问题是我的@Published 变量没有更新我的 swiftui 子视图。它从 false 变为 true,但视图本身并未更新。下面我粘贴了我的问题的一个非常简化的版本。另外,我将在 FirstView
中创建的 api 变量传递给 SubView
,但是视图仍然没有改变。如果这还不够信息,并且您可以查看完整的项目,我可以在下面分享。
import Foundation
import SwiftUI
struct FirstView: View {
@ObservedObject var Api = API()
var body: some View {
VStack{
SubView()
Button(action:{
Api.apicall()
}){
Text("search")
}
}
}
}
struct SubView:View{
@ObservedObject var daApi = API()
var array = [1,2,3]
var body: some View{
ForEach(0..<array.count){ number in
Text("\(number)")
}
if daApi.viewPresent == true{
Text("Swag")
}
}
}
class API:ObservableObject{
@Published var viewPresent:Bool = false
func apicall(){
viewPresent = true
//The Long ApiCall
viewPresent = false
}
}
答案 0 :(得分:1)
现在,您有 API
的 2 个不同实例。您需要在两个 Views
之间共享 相同 实例:
struct FirstView: View {
@ObservedObject var Api = API()
var body: some View {
VStack{
SubView(daApi: Api)
Button(action:{
Api.apicall()
}){
Text("search")
}
}
}
}
struct SubView:View{
@ObservedObject var daApi : API
var array = [1,2,3]
var body: some View{
ForEach(0..<array.count){ number in
Text("\(number)")
}
if daApi.viewPresent == true {
Text("Swag")
}
}
}
class API:ObservableObject{
@Published var viewPresent:Bool = false
func apicall(){
viewPresent = true
}
}
此外,在您的 apiCall
中,您将 viewPresent
设置为 false
,然后立即再次设置为 true
,因此我删除了其中之一。
在 Swift 中,通常变量名以小写字母开头——Api
可能应该更改为 api
。