簡體   English   中英

從 UIViewController 更改 SwiftUI 文本

[英]Change SwiftUI Text from UIViewController

我對 Swift 很陌生,對 SwiftUI 絕對陌生。 我正在嘗試將UIViewController Google Maps 和現代 SwiftUI 結合起來。 在 SwiftUI 中,我有一些Text對象,我希望我的GmapsController類能夠修改這些 Text 值,並重繪 SwiftUI 結構。

我的主要結構:

var _swiftUIStruct : swiftUIStruct = swiftUIStruct() // to have access in GmapsController
struct GoogMapView: View {
    var body: some View {
        let gmap = GmapsControllerRepresentable()
        return  ZStack {
            gmap
            _swiftUIStruct
        }
    }
}

GmapsController UIViewControllerRepresentable包裝器:

struct GmapsControllerRepresentable: UIViewControllerRepresentable {
    func makeUIViewController(context: UIViewControllerRepresentableContext<GmapsControllerRepresentable>) -> GmapsController {
        return GmapsController()
    }
    func updateUIViewController(_ uiViewController: GmapsController, context: UIViewControllerRepresentableContext<GmapsControllerRepresentable>) {}
}

GmapsController本身:

class GmapsController: UIViewController, CLLocationManagerDelegate, GMSMapViewDelegate {
    var locationManager = CLLocationManager()
    var mapView: GMSMapView!

    override func viewDidLoad() {
        super.viewDidLoad()

        locationManager.requestWhenInUseAuthorization()
        locationManager.delegate = self

        let camera = GMSCameraPosition.camera(
            withLatitude: (locationManager.location?.coordinate.latitude)!,
            longitude: (locationManager.location?.coordinate.longitude)!,
            zoom: 15
        )

        mapView = GMSMapView.map(withFrame: view.bounds, camera: camera)
        mapView.delegate = self
        self.view = mapView
    }

// HERE I WANT TO CHANGE SOME swiftUIStruct Text FIELDS

// calls after map move
    func mapView(_ mapView: GMSMapView, idleAt сameraPosition: GMSCameraPosition) {
        _swiftUIStruct.someTxt = "I hope this will work" // compilation pass, but value doesn't change
    }
}

和 swiftUIStruct 結構:

struct swiftUIStruct {
    @State var someTxt = ""
    var body: some View {
        Text(someTxt) // THE TEXT I WISH I COULD CHANGE
    }
}

在谷歌上搜索了一整天讓我覺得很愚蠢,任何幫助表示贊賞。

我希望我的示例代碼有所幫助。 基本上,將模型數據移到外面,並傳遞它,然后更改它。 如果您運行此代碼,您將看到文本“我希望這會起作用”,而不是“初始內容”。

import SwiftUI

class ViewModel: ObservableObject {
  @Published var someTxt = "Initial Content"
}

struct ContentView: View {
  @ObservedObject var viewModel = ViewModel()

  var body: some View {
    ZStack {
      GoogleMapsView(viewModel: viewModel)
      Text(viewModel.someTxt)
    }
  }
}

struct GoogleMapsView: UIViewControllerRepresentable {
  var viewModel: ViewModel

  func makeUIViewController(context: Context) -> GmapsController {
    let controller = GmapsController()
    controller.viewModel = viewModel
    return controller
  }
  func updateUIViewController(_ uiViewController: GmapsController, context: Context) {}
}

class GmapsController: UIViewController {
  var viewModel: ViewModel?

  override func viewDidLoad() {
    viewModel?.someTxt = "I hope this will work"
  }
}

struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
    return ContentView()
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM