SwiftUI: Как мне получить доступ к контроллеру из координатора (делегата MKMapView) внутри UIViewRepresentable? - PullRequest
0 голосов
/ 13 марта 2020

Редактировать:

MapViews имеют возможность показывать местоположения, добавляя булавки (или пользовательские виды) на карту. Я пытаюсь выполнить простейшую версию настройки, где я просто пытаюсь заменить всплывающее представление по умолчанию (заголовок, подзаголовок, символ информации (я с кружком вокруг него)) с настраиваемым представлением.

Использование MKMapView из SwiftUI требует использования класса UIViewRepresentable с координатором для обработки его делегата, потому что MKMapView является классом UIKit, а не структурой SwiftUI.

В UIViewController я мог бы добавить представление (или даже основное представление tableviewcontroller) в качестве подпредставления к представлению annotationView. Мой вопрос заключается в том, как сделать это с помощью встроенного структурного представления SwiftUI.

Я пытаюсь добавить пользовательский detailCalloutAccessoryView в MKPinAnnotation (MKAnnotationView)

  func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

        var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView
          if annotationView == nil {
            annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
            addDropDown(annotationView: annotationView)

}

Вот две попытки написания addDropDown():

      func addDropDown(annotationView: UIView?) {
             guard let annotationView = annotationView as? MKPinAnnotationView else { return }

// This is a UIKit UITableViewController Instance
            let tvc = RandomCapitalDropDown(nibName: nil, bundle: nil)
            annotationView.addSubview(tvc.view)

// error: Cannot convert value of type 'MKPinAnnotationView' to expected argument type 'UIViewController?'
            tvc.didMove(toParent: annotationView)
            tvc.view.leadingAnchor.constraint(equalTo: annotationView.leadingAnchor).isActive = true
            tvc.view.trailingAnchor.constraint(equalTo: annotationView.trailingAnchor).isActive = true
            tvc.view.topAnchor.constraint(equalTo: annotationView.topAnchor).isActive = true
            tvc.view.bottomAnchor.constraint(equalTo: annotationView.bottomAnchor).isActive = true
        }

// This is for a SwiftUI Struct called `PinDropDown`
        func addDropDown(annotationView: UIView?) {
            guard let annotationView = annotationView as? MKPinAnnotationView else { return }

            let child = UIHostingController(rootView: PinDropDown(gameMode: .byContinent(continent: 0)))
            child.view.translatesAutoresizingMaskIntoConstraints = false
            child.view.frame = parent.view.bounds
            // parent is UIViewRepresentable, so there is no view - this won't work
            parent.view.addSubview(child.view)
            // same issue
            parent.addChild(child)
        }

, которые я рассмотрел: SwiftUI UIViewRepresentable и Custom Delegate и Метод контроллера доступа изнутри модели и Как найти фрейм swiftui uiviewrepresentable никто из них не ответил на мой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...