MapKit:无法通过变量访问路线信息

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

嗨,希望你能帮我解决这个 swiftUI (Xcode 15) 代码吗?我创建了一个地图应用程序,它将显示通过 ManPolyLine 的路线(请参阅代码)。 虽然我可以通过(在下面的代码中)打印路线 var _ = print("ROUTE = (route.steps.map { $0.instructions }.filter { !$0.isEmpty })") 我无法为其打印的路线创建变量?我需要这样做,以便我可以创建一个 .sheet (如图所示),但无法访问变量来列出路线详细信息! 非常感谢您的帮助,TIA (下面代码的相关部分)

import SwiftUI
import MapKit

extension CLLocationCoordinate2D {
    static let parking = CLLocationManager().location?.coordinate // CLLocationCoordinate2D(latitude: 42.354528, longitude: -71.068369)
}

struct ContentView: View {
        
    @State private var position: MapCameraPosition = .automatic
    @State private var visibleRegion: MKCoordinateRegion?
    @State private var searchResults: [MKMapItem] = []
    @State private var selectedResult: MKMapItem?
    @State private var route: MKRoute?
    @State private var showDirections = false
    @State private var directions: [String] = []
    @State private var myRoute: [String] = []
    @State private var myLocation = CLLocationManager().location?.coordinate
    
    @StateObject private var viewModel = ContentViewModel()
    
    var body: some View {
        
        Map(position: $position, selection: $selectedResult)
        {
            ForEach(searchResults, id: \.self) {
                result in
                Marker(item: result)
            }
            .annotationTitles(.hidden)
            
            UserAnnotation()
            
            if let route {
                MapPolyline(route)
                    .stroke(.blue, lineWidth: 5)
                var myRoute = route.steps.map { $0.instructions }.filter { !$0.isEmpty }
                var _ = print("ROUTE = \(route.steps.map { $0.instructions }.filter { !$0.isEmpty })")
                var _ = print("COUNT = \(myRoute.count)")
            }
        }
        .onAppear()
        {
            viewModel.checkIfLocationServicesIsEnabled()
        }
        .mapStyle(.standard(elevation: .realistic))
        .safeAreaInset(edge: .bottom) {
            HStack {
                Spacer()
                VStack(spacing: 0) {
                    if let selectedResult {
                        ItemInfoView(selectedResult: selectedResult, route: route)
                            .frame(height: 128)
                            .clipShape(RoundedRectangle(cornerRadius: 10))
                            .padding([.top, .horizontal])
                    }
                    
                    Button("Show Sheet") {
                        self.showDirections.toggle()
                        self.directions = (route?.steps.map { $0.instructions }.filter { !$0.isEmpty })!
//                        Text(directions)
                    }
                    .sheet(isPresented: $showDirections) {
                        VStack(spacing: 0) {
                          Text("Directions")
                            .font(.largeTitle)
                            .bold()
                            .padding()

                          Divider().background(Color(UIColor.systemBlue))
                            
                            List(0..<self.directions.count, id: \.self) { i in
                              Text(self.directions[i]).padding()
                            }
                            
                            Button("Dismiss") {
                                self.showDirections.toggle()
                            }
                            .padding()
                            .background(Color.blue)
                            .foregroundColor(.white)
                            .cornerRadius(10)
                        }
                        .padding()
                    }
                    .padding()
                    
                    
                    
                                                      
                        
                    POI(position: $position, searchResults: $searchResults, visibleRegion: visibleRegion)
                        .padding(.top)
                        .frame(width: 350, height: 100)
                }
                Spacer()
            }
            .background(.thinMaterial)
            
        }
        .onChange(of: searchResults) {
            position = .automatic
        }
        .onChange(of: selectedResult) {
            getDirections()
        }
        .onMapCameraChange { context in
            visibleRegion = context.region
        }
        .mapControls {
            MapUserLocationButton()
            MapCompass()
            MapScaleView()
        }
    }
    
    func getDirections() {
        route = nil
        guard let selectedResult else { return }
        
        let request = MKDirections.Request()
        request.source = MKMapItem(placemark: MKPlacemark(coordinate: .parking!))
        request.destination = selectedResult
        
        Task {
            let directions = MKDirections(request: request)
            let response = try? await directions.calculate()
            route = response?.routes.first
        }
    }
}

#Preview {
    ContentView()
}
swiftui routes mapkit
1个回答
0
投票

尝试这种方法

...“attach” the array to an Array variable to use later in the code

示例代码:

import Foundation
import SwiftUI
import MapKit


struct ContentView: View {
    @State private var position: MapCameraPosition = .automatic
    @State private var selectedResult: MKMapItem?
    @State private var route: MKRoute?
    @State private var directions: [String] = []

    // for testing
    let parking = CLLocationCoordinate2D(latitude: 42.354528, longitude: -71.068369)
    let destination = CLLocationCoordinate2D(latitude: 42.326332, longitude: -71.057451)
    
    var body: some View {
        VStack {
            Map(position: $position, selection: $selectedResult) {
                if let route {
                    MapPolyline(route).stroke(.blue, lineWidth: 5)
                }
            }.mapStyle(.standard(elevation: .realistic))
            
            List(directions, id: \.self) { step in
                Text(step)
            }
        }
        .onAppear {
            getDirections()
        }
    }

    func getDirections() {
        route = nil
        
        let request = MKDirections.Request()
        request.source = MKMapItem(placemark: MKPlacemark(coordinate: parking))
        request.destination = MKMapItem(placemark: MKPlacemark(coordinate: destination))
        
        Task {
            let mkDirections = MKDirections(request: request)
            let response = try? await mkDirections.calculate()
            if let firstRoute = response?.routes.first {
                let instructions = firstRoute.steps.map {$0.instructions}.filter({ !$0.isEmpty })
                route = firstRoute
                directions = instructions  // <--- here
            }
            print("-----> self.directions: \(self.directions)")
        }
    }
    
}
© www.soinside.com 2019 - 2024. All rights reserved.