【发布时间】:2021-05-22 11:23:56
【问题描述】:
所以我正在使用 Mapbox。 map 结构符合 UIViewRepresentable 协议。在我的 makeUIView() 函数中,我创建了一个点击手势识别器并将其添加到地图视图中。
struct Map: UIViewRepresentable {
private let mapView: MGLMapView = MGLMapView(frame: .zero, styleURL: MGLStyle.streetsStyleURL)
func makeUIView(context: UIViewRepresentableContext<Map>) -> MGLMapView {
mapView.delegate = context.coordinator
let gestureRecognizer = UITapGestureRecognizer(target: context.coordinator, action: Selector("tappedMap"))
mapView.addGestureRecognizer(gestureRecognizer)
return mapView
}
func updateUIView(_ uiView: MGLMapView, context: UIViewRepresentableContext<Map>) {
print("Just updated the mapView")
}
func makeCoordinator() -> Map.Coordinator {
Coordinator(appState: appState, self)
}
// other functions that make the struct have functions required by Mapbox
func makeCoordinator() -> Map.Coordinator {
Coordinator(self)
}
final class Coordinator: NSObject, MGLMapViewDelegate {
var control: Map
//a bunch of delegate functions
@objc func tappedMap(sender: UITapGestureRecognizer) {
let locationInMap = sender.location(in: control)
let coordinateSet = sender.convert(locationInMap, toCoordinateFrom: control)
}
}
}
tappedMap 函数中的两行均未正确编译...此外,当我在 tappedMap 的参数中包含“sender: UITapGestureRecognizer”时,我在点击 mapView 时会导致应用程序崩溃--如果我删除参数,那么至少可以正确调用该函数而不会崩溃。请帮忙
【问题讨论】:
-
您从崩溃中得到什么错误/堆栈跟踪?我不知道 Mapbox,但我会从
tappedMap内的断点开始,然后检查那里接收到的对象。 -
@JohnNimis 我不知道 Xcode 中的堆栈跟踪在哪里......对不起这里的新手 - 抛出的错误说 Thread 1: ........ :无法识别的选择器发送到实例,然后是我认为的内存地址。这让我相信它没有收到 UITapGestureRecognizer 而是其他东西,对吗?此外,如果我在方法的第一行设置断点(当我将第一行设置为打印语句时),仍然会引发错误,因此它与 tappedMap 函数正在接收的内容或它的调用方式有关
-
好的,我正在尝试重现该错误,但我得到一堆编译器错误:一个是“类'Map.Coordinator'没有初始化程序”,另一个必须做使用
mapView属性,该属性未在您的代码示例中声明。另外,您是否在这些文件中导入了 MapKit?您可能会考虑以不同的方式命名您的Map结构,以防出现某种命名空间冲突。 -
这不是 MapKit,这是 MapBox,你需要一个 pod 文件来导入正确的 cocoapods
-
是的,我知道,我已经导入了 Mapbox。我问是因为 MapKit 还定义了一个名为
Map的结构。我只是注意到这一点,因为我的示例项目已经在不同的文件中有一些 MapKit 代码。
标签: swift swiftui mapbox uitapgesturerecognizer uiviewrepresentable