我在 SwiftUI 中迁移到新的 iOS17 MapKit 时遇到理解问题。 我的应用程序中有此代码:
NavigationStack {
Map(coordinateRegion: $mapRegion, annotationItems: destinations) { destination in
MapAnnotation(coordinate: destination.coordinate) {
NavigationLink {
DestinationDetailView(destination: destination)
} label: {
VStack {
Image(systemName: "\(destination.locationType.attributes.icon)")
.font(.largeTitle)
.foregroundColor(destination.locationType.attributes.color)
Text("\(destination.name)")
.foregroundColor(.black)
.font(.subheadline)
}
}
}
}
}
工作正常,选择注释时打开 DestinationDetailView。 但有警告(由于新的 iOS 17): “MapAnnotation”在 iOS 17.0 中已弃用:使用 Annotation 以及采用 MapContentBuilder 的地图初始值设定项。
我阅读了新的MapKit规范并将代码更改为:
NavigationStack {
Map(position: $position, selection: $mapSelection) {
ForEach(destinations, id: \.locationId) { destination in
Marker(destination.name, coordinate: destination.coordinate)
.tint(destination.locationType.attributes.color)
.tag(destination)
}
}
.onChange(of: mapSelection) { oldValue, newValue in
if mapSelection != nil {
print("Selection: \(mapSelection!.name)")
NavigationLink("",destination: DestinationDetailView(destination: mapSelection!))
}
}
}
它显示相同的地图,在选择时对标记进行动画处理,但不会启动朝向 DestinationDetailView 的导航。 我错过了什么?
navigationDestination(item:destination:)
。将用于地图选择的相同绑定传递到此,并给出一个返回目标视图的闭包(给定选定的项目)。
.navigationDestination(item: $mapSelection) { selection in
DestinationDetailView(destination: selection)
}