如何在Swift UIKit Map组件的SwiftUI中处理触摸手势? [英] How to handle touch gestures in SwiftUI in Swift UIKit Map component?
本文介绍了如何在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屋!
查看全文