Как сделать щелчок на булавке в новом представлении карты SwiftUI? - PullRequest
2 голосов
/ 02 августа 2020

Я использую новое представление карты SwiftUI для отображения булавок для аннотаций, и хотел бы, чтобы булавки при нажатии отображали представление для редактирования имени и описания аннотации.

Я пытался использовать MapAnnotation с представлением, содержащим кнопку с изображением булавки. Изображение отображается правильно, но кнопка не работает.

Можно ли сделать это, не возвращаясь к UIViewRepresentable в MKMapView?

import SwiftUI
import MapKit

struct ContentView: View {
    @State private var showingEditScreen = false

    @State private var region = MKCoordinateRegion(
        center: CLLocationCoordinate2D(latitude: 37.334722,
                                       longitude: -122.008889),
        span: MKCoordinateSpan(latitudeDelta: 1,
                               longitudeDelta: 1)
    )

    @State private var pins: [Pin] = [
        Pin(name: "Apple Park",
            description: "Apple Inc. headquarters",
            coordinate: CLLocationCoordinate2D(latitude: 37.334722,
                                               longitude:-122.008889))
    ]

    var body: some View {
        Map(coordinateRegion: $region,
            interactionModes: .all,
            annotationItems: pins,
            annotationContent: { pin in
                MapAnnotation(coordinate: pin.coordinate,
                              content: {
                                PinButtonView(pin: pin)
                              })
            })
    }
}

Определение моего PIN-кода:

struct Pin: Identifiable {
    let id = UUID()
    var name: String
    var description: String
    var coordinate: CLLocationCoordinate2D

}

Вид с изображением кнопки и булавки:

struct PinButtonView: View {
    @State private var showingEditScreen = false
    @State var pin: Pin

    var body: some View {
        Button(action: {
            showingEditScreen.toggle()
        }) {
            Image(systemName: "mappin")
                .padding()
                .foregroundColor(.red)
                .font(.title)
        }
        .sheet(isPresented: $showingEditScreen,
               content: {
                EditView(pin: self.$pin)
               })
    }
}

Вид редактирования:

struct EditView: View {
    @Environment(\.presentationMode) var presentationMode

    @Binding var pin: Pin

    var body: some View {
        NavigationView {
            Form {
                    TextField("Place name", text: $pin.name)

                    TextField("Description", text: $pin.description)
            }
            .navigationTitle("Edit place")
            .navigationBarItems(trailing: Button("Done") {
                self.presentationMode.wrappedValue.dismiss()
            })
        }
    }
}

1 Ответ

0 голосов
/ 04 сентября 2020

Во-первых, вы представляете лист не в том месте. Представление листа должно выполняться в ContentView . Где вы создаете PinButtonView .

Вот рабочий пример:

struct Place: Identifiable {
    var id = UUID()
    let name: String
    let coordinate: CLLocationCoordinate2D
}

struct PlacesMapView: View {
    
    let places: [Place] = [
        .init(name: "One", coordinate: .init(latitude: 56.951924, longitude: 24.125584)),
        .init(name: "Two", coordinate: .init(latitude:  56.967520, longitude: 24.105760)),
        .init(name: "Five", coordinate: .init(latitude: 56.9539906, longitude: 24.13649290000000))
    ]
    
    @State var coordinateRegion = MKCoordinateRegion(center: .init(latitude: 54.6872, longitude: 25.2797), latitudinalMeters: 2000000, longitudinalMeters: 2000000)
    @State var place: Place?
    
    var body: some View {
        Map(coordinateRegion: $coordinateRegion, annotationItems: places) { (place) in
            MapAnnotation(coordinate: place.coordinate) {
                Button(action: { self.place = place }, label: {
                    Text(place.name)
                })
            }
        }
        .sheet(item: $place) { (place) in
            Text(place.name)
        }
    }
}

Я хочу заметить, что на карте все еще есть ошибка, что после увеличения пины не могут Выбрать. Для выбора необходимо перемещаться влево / вправо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...