У меня есть приложение SwiftUI, где пара представлений - это карты MapKit, созданные с помощью UIViewRepresentable. У меня есть пользовательские аннотации для точек интереса и я использую правую и левую кнопки выноски для дальнейших действий. Справа я просто хочу отобразить информацию о путевой точке. Слева я хочу поднять предупреждение с выбором дальнейших действий - например, вставить новую точку аннотации. Перед SwiftUI я просто поднял предупреждение и сделал оба вышеперечисленных. Но из того, что я могу сказать, в версиях UIViewRepresentable отсутствует self.present. Поэтому я не смог представить оповещения.
Просто для эксперимента - я прикрепил код оповещения SwiftUI к представлению SwiftUI, которое вызывает MapView. Используя наблюдаемые логические значения, я действительно могу поднять оба этих предупреждения. Это кажется странным для меня, но, возможно, код для предупреждений, связанных с глобальными свойствами, может быть где угодно
Моя первая попытка: (структура - DetailMapView)
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
if control == view.leftCalloutAccessoryView {
guard let tappedLocationCoord = view.annotation?.coordinate else {return}
let tappedLocation = CLLocation(latitude: tappedLocationCoord.latitude, longitude: tappedLocationCoord.longitude)
let ac = UIAlertController(title: nil, message: nil, preferredStyle: .alert)
let deleteAction = UIAlertAction(title: "Delete Waypoint", style: .destructive) { (action) in
//some stuff
}
let insertAction = UIAlertAction(title: "Insert Waypoint After This", style: .default) { (action) in
//some stuff
}
let cancelAction = UIAlertAction(title: "Cancel", style: .default) { (action) in
//some stuff
}//cancelAction
ac.addAction(deleteAction)
ac.addAction(insertAction)
ac.addAction(cancelAction)
//tried adding self, referencing parent - always error saying
//the object does not have a .present
mapView.present(ac, animated: true)
} else if control == view.rightCalloutAccessoryView {
//more of the same
}
}//annotationView
Затем я удалил код предупреждения и добавил:
parent.userDefaultsManager.shouldShowAnnotationEditMenu.toggle()
И я изменил экран вызова на :
@ObservedObject var userDefaultsManager: UserDefaultsManager
var aTrip: Trip?
var body: some View {
VStack {
Text(aTrip?.name ?? "Unknown Map Name")
.padding(.top, -50)
.padding(.bottom, -20)
DetailMapView(aTrip: aTrip, userDefaultsManager: userDefaultsManager)
.padding(.top, -20)
.alert(isPresented: $userDefaultsManager.shouldShowAddress) {
//Alert(title: Text("\(aTrip?.name ?? "No") Address"),
Alert(title: Text(self.userDefaultsManager.approximateAddress),
message: Text("This is the approximate street address."),
dismissButton: .default(Text("Got it!")))
}//.alert shouldShowAddress
Text("This is the view where the trip information will be displayed.")
.multilineTextAlignment(.center)
.alert(isPresented: $userDefaultsManager.shouldShowAnnotationEditMenu) {
Alert(title: Text("Edit Annotations"),
message: Text("Choose this to insert an Annotation."),
dismissButton: .default(Text("Got it!")))
}//.alert shouldShowAddress
}
}
Полагаю, если это безопасно, я мог бы заставить его работать - но это кажется более сложным, чем должно быть.
Это идея:
Будем благодарны за любые рекомендации: Xcode Version 11.3.1 (11C504)