@Published Var 不更新子视图

时间:2021-05-07 06:59:27

标签: ios swift swiftui

我的问题是我的@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
    }
}

1 个答案:

答案 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