ios - 调用时未在地图视图上显示注释
问题描述
这是与我的故事板匹配的更新代码。有两个不同的子视图控制器,地图视图和集合视图。当用户单击允许卡片折叠和展开的按钮时,ContentViewController 也有一个动画。mapView 是一个单独的视图。问题是当我运行它时,在显示动画时会显示一个新的视图控制器,而不是只替换 MapViewController。理想情况下,运行此程序时,用户将展开卡片视图,然后单击集合视图单元格,然后新的注释将填充屏幕顶部(因为这是地图视图所在的位置)。使用我当前的代码,注释不会显示在屏幕上。我将如何解决这个问题,以便在单击单元格时可以看到受尊重的注释?
这是代码。
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!
}
解决方案
您需要UICollectionView
在其中创建一个ViewController
,然后将索引值传递给另一个ViewController
以将其显示在MKMapView
.
在这里创建了一个示例项目
推荐阅读
- android - 在主题中更改页面背景
- flutter - 脚手架后面的小部件
- sql-server - SQL 部署自动化
- java - 如何在 Spring Boot 中将 @MockBean 与 JUnit 5 一起使用?
- c# - ASP.NET Web API 避免将文件保存为“BodyPart_...”
- oracle - 如何在 Oracle apex 的页眉上显示登录的用户 ID?
- git - 删除大小(在磁盘空间中)大于给定值的提交
- shell - : 使用 ansible shell 模块的 grep 命令中的字符错误
- upgrade - Apostrophecms 2.86 版本升级问题
- c - 如何使用 libmodbus 从 modbus/tcp 读取