Masalah saya adalah variabel @Published saya tidak memperbarui subview swiftui saya. Itu berubah dari salah menjadi benar, namun tampilan itu sendiri tidak diperbarui. Di bawah ini saya menempelkan versi masalah saya yang sangat disederhanakan. Juga, saya meneruskan variabel api yang dibuat dalam FirstView ke SubView, namun tampilan tetap tidak berubah. Jika ini tidak cukup informasi dan Anda baik-baik saja dengan melihat proyek lengkap saya dapat membagikannya di bawah.

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
CalebThePerson 7 Mei 2021, 09:59

1 menjawab

Jawaban Terbaik

Saat ini, Anda memiliki 2 berbeda instance API. Anda perlu berbagi instance sama antara kedua 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
    }
}

Juga, di apiCall Anda, Anda menyetel viewPresent ke false dan kemudian true segera lagi, jadi saya menghapus salah satunya.

Di Swift, umumnya nama variabel dimulai dengan huruf kecil -- Api mungkin harus diubah menjadi api.

1
jnpdx 7 Mei 2021, 07:03