iOS SwiftUI中如何让Mapbox NavigationServiceDelegate方法被调用?
你遇到的核心问题是代理方法签名不匹配,导致Mapbox SDK无法识别并调用你的实现,另外手动创建NavigationService也可能带来生命周期关联问题,以下是具体的修复方案:
一、修正代理方法的参数类型
你当前实现的didPassVisualInstructionPoint方法参数用了VisualInstructionBanner,但Mapbox Navigation SDK中该方法的正确参数类型是VisualInstruction(视觉指令数据模型,而非视图类)。修正后的Coordinator代码如下:
class Coordinator: NSObject, NavigationServiceDelegate { func navigationService(_ service: NavigationService, didPassVisualInstructionPoint instruction: VisualInstruction, routeProgress: RouteProgress) { print("Visual Instruction: \(instruction.text)") // 现在会正常触发 } func navigationService(_ service: NavigationService, didPassSpokenInstructionPoint instruction: SpokenInstruction, routeProgress: RouteProgress) { print("Spoken Instruction: \(instruction.text)") // 现在会正常触发 } }
二、优化NavigationService的关联方式
手动创建NavigationService容易出现生命周期不匹配的问题,建议直接使用NavigationViewController自带的服务实例,并设置代理:
func makeUIViewController(context: Context) -> NavigationViewController { guard let routeResponse = mapData.routeResponse else { // 处理routeResponse为空的情况,避免崩溃 fatalError("Route response cannot be nil") } let indexedRouteResponse = IndexedRouteResponse(routeResponse: routeResponse, routeIndex: 0) // 直接初始化导航控制器,无需手动创建NavigationService let navViewController = NavigationViewController(for: indexedRouteResponse) // 给导航控制器自带的NavigationService设置代理 navViewController.navigationService.delegate = context.coordinator return navViewController }
额外注意事项
- 检查你使用的Mapbox Navigation SDK版本,不同版本的代理方法签名可能略有差异,请确保与官方文档对应版本的定义一致。
- 确保
Coordinator正确继承NSObject,因为Mapbox的代理基于Objective-C运行时,只有继承NSObject的类才能正确响应代理方法。 - 避免在
updateUIViewController中重复设置代理,防止不必要的重复绑定。
内容的提问来源于stack exchange,提问作者sw2500
相关产品推荐
相关产品推荐

