“MapAnnotation”在 iOS 17.0 中已弃用:使用 Annotation 以及采用 MapContentBuilder 的地图初始值设定项

问题描述 投票:0回答:1

我在 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 的导航。 我错过了什么?

swiftui mapkit ios17
1个回答
0
投票

您可以使用

navigationDestination(item:destination:)
。将用于地图选择的相同绑定传递到此,并给出一个返回目标视图的闭包(给定选定的项目)。

.navigationDestination(item: $mapSelection) { selection in
    DestinationDetailView(destination: selection)
}
© www.soinside.com 2019 - 2024. All rights reserved.