嗨,希望你能帮我解决这个 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()
}
尝试这种方法
...“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)")
}
}
}