如何在Swift UIKit Map组件的SwiftUI中处理触摸手势? [英] How to handle touch gestures in SwiftUI in Swift UIKit Map component?

查看:178
本文介绍了如何在Swift UIKit Map组件的SwiftUI中处理触摸手势?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在SwiftUI应用程序中处理Map UIKit组件手势. Xcode显示以下警告:字符串文字不是有效的Objective-C选择器"

I tried to handle Map UIKit component gestures in SwiftUI application. Xcode shows this warning: "String literal is not a valid Objective-C selector"

// Binding to UIKit component

import SwiftUI
import MapKit

struct MapView: UIViewRepresentable {

    class Coordinator: NSObject, MKMapViewDelegate {
        @Binding var selectedPin: MapPin?

        init(selectedPin: Binding<MapPin?>) {
            self._selectedPin = selectedPin
        }

        func mapView(_ mapView: MKMapView,
                     didSelect view: MKAnnotationView) {
            guard let pin = view.annotation as? MapPin else {
                return
            }
            pin.action?()
            selectedPin = pin
        }

        func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
            guard (view.annotation as? MapPin) != nil else {
                return
            }
            selectedPin = nil
        }
       }

    @Binding var pins: [MapPin]
    @Binding var selectedPin: MapPin?

    func makeCoordinator() -> Coordinator {
      return Coordinator(selectedPin: $selectedPin)
    }

    func makeUIView(context: Context) -> MKMapView {
        let view = MKMapView(frame: .zero)
        let gRecognizer = UITapGestureRecognizer(target: self, action: #selector(triggerTouchAction(gestureRecognizer:)))
          view.addGestureRecognizer(gRecognizer)
          view.delegate = context.coordinator
          return view
    }

    func updateUIView(_ uiView: MKMapView, context: Context) {
        uiView.removeAnnotations(uiView.annotations)
        uiView.addAnnotations(pins)
        if let selectedPin = selectedPin {
            uiView.selectAnnotation(selectedPin, animated: false)
        }
    }

    @objc func triggerTouchAction(gestureReconizer: UITapGestureRecognizer) {
          //Add alert to show it works
        print("Hello, tap!")
    }
}

我希望Xcode控制台中出现消息,但不会产生触摸事件.

I expect messages in my Xcode console, but no touch events produced.

环境: Xcode 11 Beta 6 macOS Mojave 10.14.6

Environment: Xcode 11 beta 6 macOS Mojave 10.14.6

推荐答案

@objc不能应用于结构内部的函数.将函数移到协调器内部,然后通过以下方式更改UIGestureRecognizer声明:

@objc can't be applied to functions inside structs. Move the function inside the Coordinator and then change the UIGestureRecognizer declaration this way:

let gRecognizer = UITapGestureRecognizer(target: context.coordinator, action: #selector(Coordinator.triggerTouchAction(gestureReconizer:)))

这篇关于如何在Swift UIKit Map组件的SwiftUI中处理触摸手势?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆