Saya memiliki tampilan swiftUI yang memanggil tampilan UIViewRepresentable. Dalam tampilan SwiftUI saya mengubah status nilai boolean @State.

Dalam tampilan UIViewRepresentable saya, saya telah membuat pengikatan yang melewati dari tampilan SwiftUI utama. Masalahnya adalah pengikatan tidak pernah mendapat pembaruan atau setidaknya fungsi updateView tidak dipanggil dalam tampilan UIViewRepresentable. Saya jatuh seperti saya pasti melakukan sesuatu yang salah tetapi saya hanya mengabaikannya. Berikut adalah contoh dari apa yang saya coba lakukan.

  import Foundation
  import SwiftUI

 struct BindingTest: UIViewRepresentable {

@Binding var status: Bool


func makeUIView(context: Context) -> UIActivityIndicatorView {
    
    let activityIndicator = UIActivityIndicatorView()
    
    activityIndicator.style = .large
    
    return activityIndicator
}

func updateUIView(_ uiView: UIViewType, context: Context) {
    
    
    print("Hello")
    
}

}



 import SwiftUI

 struct ChartView: View {

@State var status = false

var body: some View {

    
    VStack{
        
        Spacer()
    
    Button(action: {
        
       status = !status
        
    }) {
        
        Text("Change")
        
    }

    BindingTest(status: $status)
    
    
        
    }
}
}

Saya menggunakan Xcode 12.5 dan Swift 5.4

0
kka41 13 Mei 2021, 04:10

1 menjawab

Jawaban Terbaik

Sepertinya SwiftUI melakukan beberapa kepintaran yang tidak langsung terlihat oleh kami. Karena Anda sebenarnya tidak menggunakan binding Anda di updateUIView, itu sebenarnya tidak dipanggil.

Namun, jika Anda memperbarui kode Anda sebagai berikut:

func updateUIView(_ uiView: UIViewType, context: Context) {
  print("Hello \(status)")
}

Maka Anda akan melihat bahwa ia memang dipanggil.

PS - Anda dapat menggunakan status.toggle() sebagai ganti status = !status

1
jnpdx 13 Mei 2021, 01:31