Изменить текст SwiftUI из UIViewController - PullRequest
0 голосов
/ 16 февраля 2020

Я совершенно новичок в Swift и абсолютно новичок в SwiftUI. Я пытаюсь объединить UIViewController Google Maps и современный SwiftUI. В SwiftUI у меня есть несколько Text объектов, и я хочу, чтобы мой класс GmapsController мог изменять эти текстовые значения и перерисовывал структуру SwiftUI.

Моя основная структура:

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

UIViewControllerRepresentable оболочка GmapsController:

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
    }
}

Поиск в Google этот целый день заставил меня чувствовать себя глупым, любая помощь приветствуется.

1 Ответ

1 голос
/ 16 февраля 2020

Надеюсь, мой пример кода поможет. По сути, выведите данные модели наружу, передайте их и измените. Если вы запустите этот код, вы увидите текст «Я надеюсь, что это сработает», а не «Начальный контент».

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()
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...