[英]Annotations not being displayed on map view when called
Here is my updated code that matches my storyboard.这是与我的 storyboard 匹配的更新代码。 There are two different child view controllers, the map view and the collection view.
有两个不同的子视图控制器,map 视图和集合视图。 The ContentViewController also has an animation when the user clicks the button that allows for the card to collapse and expand.
当用户单击允许卡片折叠和展开的按钮时,ContentViewController 还具有 animation。 The mapView is a separate view.
mapView 是一个单独的视图。 The problem is that when I run this, a new view controller is displayed when showing an animation instead of having just the MapViewController be replaced.
问题是当我运行它时,当显示 animation 而不是只替换 MapViewController 时,会显示一个新视图 controller。 Ideally when running this, a user would expand the card view, then click on a collection view cell and then new annotations would populate the top of the screen (because that is where the map view is).
理想情况下,运行此程序时,用户将展开卡片视图,然后单击集合视图单元格,然后新的注释将填充屏幕顶部(因为这是 map 视图所在的位置)。 With my current code the annotations are not being displayed on screen.
使用我当前的代码,注释不会显示在屏幕上。 How would I fix this so that I can see the respected annotations when clicking on the cell?
我将如何解决这个问题,以便在单击单元格时可以看到受尊重的注释?
Here is the code.这是代码。
import UIKit
import MapKit
struct PlacesOnMap {
var name: String
var latitude: Double
var longitude: Double
init(name: String, latitude: Double, longitude: Double) {
self.name = name
self.latitude = latitude
self.longitude = longitude
}
}
class ContentViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, MKMapViewDelegate {
@IBOutlet weak var mapView: MKMapView!
var placesVal = [PlacesOnMap(name: "place 1", latitude: 12.9716, longitude: 77.5946),
PlacesOnMap(name: "place 2", latitude: 12.2958, longitude: 76.6394),
PlacesOnMap(name: "place 3", latitude: 11.4102, longitude: 76.6950)
]
var buildings = [PlacesOnMap(name: "buildings 1", latitude: 12.9716, longitude: 77.5946),
PlacesOnMap(name: "buildings 2", latitude: 12.2958, longitude: 76.6394)
]
var recreation = [PlacesOnMap(name: "recreation 1", latitude: 28.54693, longitude: -81.393071),
PlacesOnMap(name: "recreation 2", latitude: 28.538523, longitude: -81.385399),
PlacesOnMap(name: "recreation 3", latitude: 28.542817, longitude: -81.378117),
PlacesOnMap(name: "recreation 4", latitude: 28.538985, longitude: -81.404694)
]
//helps create an intial view for the mapView; zooms in on Orlando
let startingLocation = CLLocation(latitude: 28.5383, longitude: -81.3792)
let distanceSpan: CLLocationDistance = 4000
let reuseIdentifier = "cell" // also enter this string as the cell identifier in the storyboard
var items = ["Places", "Buildings", "Recreations"]
override func viewDidLoad() {
super.viewDidLoad()
zoomLevel(location: startingLocation)
}
//controls how much the map is zoomed in based off of intial inputs from the startingLocation variable
func zoomLevel(location: CLLocation) {
let mapCoordinate = MKCoordinateRegion(center: location.coordinate, latitudinalMeters: distanceSpan, longitudinalMeters: distanceSpan)
mapView?.setRegion(mapCoordinate, animated: true)
}
// tell the collection view how many cells to make
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.items.count
}
// make a cell for each cell index path
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// get a reference to our storyboard cell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! Cell
// Use the outlet in our custom class to get a reference to the UILabel in the cell
cell.textLabel.text = self.items[indexPath.item]
cell.backgroundColor = UIColor.cyan
return cell
}
// MARK: - UICollectionViewDelegate protocol
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// handle tap events
print("You selected cell #\(indexPath.item)!")
if(indexPath.item == 0){
setPlacesAnnotations()
}else if(indexPath.item == 1){
setBuildingsAnnotations()
}else if(indexPath.item == 2){
setRecreationAnnotations()
}
mapView?.delegate = self
}
func setPlacesAnnotations() {
let places = placesVal.map { placeOnMap -> MKPointAnnotation in
let place = MKPointAnnotation()
place.coordinate = CLLocationCoordinate2D(latitude: placeOnMap.latitude, longitude: placeOnMap.longitude)
place.title = placeOnMap.name
return place
}
mapView?.removeAnnotations(mapView.annotations)
mapView?.addAnnotations(places)
}
func setBuildingsAnnotations() {
let places = buildings.map { placeOnMap -> MKPointAnnotation in
let place = MKPointAnnotation()
place.coordinate = CLLocationCoordinate2D(latitude: placeOnMap.latitude, longitude: placeOnMap.longitude)
place.title = placeOnMap.name
return place
}
mapView?.removeAnnotations(mapView.annotations)
mapView?.addAnnotations(places)
}
func setRecreationAnnotations() {
let places = recreation.map { placeOnMap -> MKPointAnnotation in
let place = MKPointAnnotation()
place.coordinate = CLLocationCoordinate2D(latitude: placeOnMap.latitude, longitude: placeOnMap.longitude)
place.title = placeOnMap.name
return place
}
mapView?.removeAnnotations(mapView.annotations)
mapView?.addAnnotations(places)
}
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
guard let annotationTitle = view.annotation?.title else
{
print("Unable to retrieve details")
return
}
print("User tapped on annotation with title: \(annotationTitle!)")
}
}
class Cell: UICollectionViewCell {
@IBOutlet weak var textLabel: UILabel!
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.