ios - 地图注释点击未触发且注释栏未显示
问题描述
我正在尝试获取单个事件详细信息以在新的视图控制器中实例化它们,但是当我点击地图上出现的注释时,我似乎无法弄清楚在打印事件名称时我出了什么问题,任何帮助表示赞赏
地图视图控制器:
class MapViewController: UIViewController {
var userRides: [UserRides] = []
@IBOutlet weak
var HostButton: UIButton!
@IBOutlet weak
var ViewButton: UIButton!
@IBOutlet weak
var mapView: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
getRides()
NotificationCenter.default.addObserver(self, selector: #selector(refreshRides), name: Notification.Name("refresh"), object: nil)
}
@objc func refreshRides(notification: NSNotification) {
getRides()
}
func getRides() {
let db = Firestore.firestore()
db.collection("Events").getDocuments() {
(snapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
let documents = snapshot!.documents
try !documents.forEach {
document in
let userRides: UserRides =
try document.decoded()
print(userRides.rideName)
self.userRides.append(userRides)
}
for ride in 0.. < self.userRides.count {
let mapPins = EventAnno()
let rides = self.userRides[ride]
mapPins.title = rides.rideName
mapPins.myRide = rides
let coordinate = CLLocationCoordinate2D(latitude: rides.rideYCordinate, longitude: rides.rideXCordinate)
mapPins.coordinate = coordinate
self.mapView.addAnnotation(mapPins)
print(self.userRides.count)
}
}
}
}
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
if let eventAnnotation = view.annotation as ? EventAnno {
let theEvent = eventAnnotation.myRide
print(theEvent ? .rideName ? ? "ride name")
}
}
}
class EventAnno: MKPointAnnotation {
var myRide: UserRides ?
}
用户乘车:
struct UserRides: Decodable{
let rideDate : String
let rideLeader : String
let rideLeaderUID : String
let rideLocation : String
let rideName : String
let rideType: String
let rideXCordinate : Double
let rideYCordinate : Double
}
- - - - - - - - - - - - - - - 编辑 - - - - - - - - - - ------------
下面是我在MapViewController上的第二次尝试,从不同的角度获取它,但仍然没有结果。
class MapViewController: UIViewController{
var userRides:[UserRides] = []
@IBOutlet weak var HostButton: UIButton!
@IBOutlet weak var ViewButton: UIButton!
@IBOutlet weak var mapView: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
getRides()
NotificationCenter.default.addObserver(self, selector: #selector(refreshRides), name: Notification.Name("refresh"), object: nil)
mapView.delegate = self
}
@objc func refreshRides (notification: NSNotification){
getRides()
}
func getRides(){
let db = Firestore.firestore()
db.collection("Events").getDocuments() { (snapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
let documents = snapshot!.documents
try! documents.forEach{document in
let userRides: UserRides = try document.decoded()
print(userRides.rideName)
self.userRides.append(userRides)
}
for ride in 0..<self.userRides.count {
let mapPins = MKPointAnnotation()
let rides = self.userRides[ride]
mapPins.title = rides.rideName
let coordinate = CLLocationCoordinate2D(latitude: rides.rideYCordinate, longitude: rides.rideXCordinate)
mapPins.coordinate = coordinate
self.mapView.addAnnotation(mapPins)
print(self.userRides.count)
}
}
}
}
}
extension MapViewController: MKMapViewDelegate {
func annotateMap() {
var parent: MapViewController func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
let identifier="Placemark" var annotationView=mapView.dequeueReusableAnnotationView(withIdentifier: identifier) if annotationView==nil {
annotationView=MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) annotationView?.canShowCallout=true annotationView?.rightCalloutAccessoryView=UIButton(type: .detailDisclosure)
}
else {
annotationView?.annotation=annotation
}
return annotationView
}
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
print("\(String(describing: view.annotation?.title))")
}
}
}
解决方案
这是从firebase获取pin数据的工作代码,我的问题是我在weakVar上引用了不正确的地图,请检查您的变量!
import UIKit
import MapKit
import Firebase
import FirebaseAuth
class MapViewController: UIViewController{
var userRides:[UserRides] = []
@IBOutlet weak var HostButton: UIButton!
@IBOutlet weak var ViewButton: UIButton!
@IBOutlet weak var mapView: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
getRides()
NotificationCenter.default.addObserver(self, selector: #selector(refreshRides), name: Notification.Name("refresh"), object: nil)
mapView.delegate = self
}
@objc func refreshRides (notification: NSNotification){
getRides()
}
func getRides(){
let db = Firestore.firestore()
db.collection("Events").getDocuments() { (snapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
let documents = snapshot!.documents
try! documents.forEach{document in
let userRides: UserRides = try document.decoded()
print(userRides.rideName)
self.userRides.append(userRides)
}
for ride in 0..<self.userRides.count {
let mapPins = MKPointAnnotation()
let rides = self.userRides[ride]
mapPins.title = rides.rideName
let coordinate = CLLocationCoordinate2D(latitude: rides.rideYCordinate, longitude: rides.rideXCordinate)
mapPins.coordinate = coordinate
self.mapView.addAnnotation(mapPins)
}
}
}
}
}
extension MapViewController: MKMapViewDelegate{
func mapView(_ mapView: MKMapView,
viewFor annotation: MKAnnotation) -> MKAnnotationView? {
if annotation is MKUserLocation {
//return nil so map view draws "blue dot" for standard user location
return nil
}
let reuseId = "pin"
var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId) as? MKPinAnnotationView
if pinView == nil {
pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
pinView!.canShowCallout = true
pinView!.animatesDrop = true
pinView!.pinTintColor = .purple
pinView!.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
}
else {
pinView!.annotation = annotation
}
return pinView
}
}
推荐阅读
- c# - 在哪里可以找到 DocuSign 电子签名 REST API 的最新 Swagger 定义?
- javascript - 将数组拆分为具有一定长度的 n 个数组
- windows - 如何通过 Docker 访问我电脑上的文件
- javascript - Javascript 中的 ScrollTop 和 ScrollLeft
- swift - 之前写的代码,开发者做了一个返回块的静态var?
- java - 如何在我的代码中 Junit 测试 try catch 块
- html - mat-expansion-panel 删除边框
- git - standard_init_linux.go:185:exec 用户进程导致“没有这样的文件或目录”构建 docker 映像
- python - 使用 Visual Studio Code 在 ROS 中调试 python 脚本
- c++ - 第一次尝试构建通用单链表,出现未定义符号错误