Mapkit 根据所选注释标注到各个页面
Mapkit callout to individual pages depending on annotation selected
我的地图上有 20 个图钉,点击每个图钉时都会显示带有场地名称的注释,并且在右侧有一个标注按钮。我已经使用 segue 成功地将此按钮 link 编辑到单个页面。问题是所有位置都 link 到同一页面。我想要 20 个单独的页面,每个 link 到一个特定的 pin。我在网上找到的几乎所有示例都希望生成一个包含传入信息的页面。这是我的代码。
import UIKit
import MapKit
import CoreLocation
class MapContollerViewController: UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var mapView: MKMapView!
// NEED TO SET THIS INT SOMEWHERE DEPENDING ON WHICH LOCATION IS SELECTED
var venueNo: Int = 2
// MARK: - CLLocationManager
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
checkLocationAuthorizationStatus()
}
let locationManager = CLLocationManager()
func checkLocationAuthorizationStatus() {
if CLLocationManager.authorizationStatus() == .authorizedAlways {
mapView.showsUserLocation = true
} else {
locationManager.requestAlwaysAuthorization()
}
}
let regionRadius: CLLocationDistance = 800
func centerMapOnLocation(location: CLLocation) {
let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate,
regionRadius, regionRadius)
mapView.setRegion(coordinateRegion, animated: true)
}
override func viewDidLoad() {
let classInstance = MapContollerViewController() //swift allocates memory and creates an instance
classInstance.venueNo = 2
super.viewDidLoad()
mapView.delegate = self
let initialLocation = CLLocation(latitude: 56.457539, longitude: -2.9821680000000015)
//UNION
let artwork = Artwork(title: "The Union",
locationName: "Airlie Place",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.457539, longitude: -2.9821680000000015),
venueNo:1)
//changing value here but in wrong place
venueNo = 1
mapView.addAnnotation(artwork)
// TINSMITH
let artwork2 = Artwork(title: "The Tin Smith",
locationName: "11-13 Old Hawkhill",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4594785, longitude: -2.980198400000063),
venueNo:2)
mapView.addAnnotation(artwork2)
// Grafters
let artwork3 = Artwork(title: "Grafters",
locationName: "Union Street",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4588498, longitude: -2.9709077999999636),
venueNo:3)
mapView.addAnnotation(artwork3)
// The Bird & Bear
let artwork4 = Artwork(title: "The Bird & Bear",
locationName: "2 Whitehall Cres",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4592973, longitude: -2.968744700000002),
venueNo:4)
mapView.addAnnotation(artwork4)
// The Salty Dog
let artwork5 = Artwork(title: "The Salty Dog",
locationName: "9 Crichton St",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.459916, longitude: -2.9701755999999477),
venueNo:5)
mapView.addAnnotation(artwork5)
// Jam Jar
let artwork6 = Artwork(title: "Jam Jar",
locationName: "2b Whitehall Cres",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.45916279999999, longitude: -2.9688820999999734),
venueNo:6)
mapView.addAnnotation(artwork6)
// Church
let artwork7 = Artwork(title: "Church",
locationName: "15 Ward Rd",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4617273, longitude: -2.9758415000000014),
venueNo:7)
mapView.addAnnotation(artwork7)
// No'1s
let artwork8 = Artwork(title: "No'1s",
locationName: "1 Ward Rd",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4618699, longitude: -2.9745715000000246),
venueNo:8)
mapView.addAnnotation(artwork8)
// Medina
let artwork9 = Artwork(title: "Medina",
locationName: "113 Nethergate",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4576889, longitude: -2.9751609),
venueNo:9)
mapView.addAnnotation(artwork9)
// Westport
let artwork10 = Artwork(title: "Westport Bar",
locationName: "N Lindsay St",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4606814, longitude: -2.975895000000037),
venueNo:10)
mapView.addAnnotation(artwork10)
// D'Arcy thompson
let artwork11 = Artwork(title: "D'Arcy Thompson",
locationName: "Old Hawkhill",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4594204, longitude: -2.9805648999999903),
venueNo:11)
mapView.addAnnotation(artwork11)
// Tonic
let artwork12 = Artwork(title: "Tonic",
locationName: "141 Nethergate",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4572926, longitude: -2.9762908000000152),
venueNo:12)
mapView.addAnnotation(artwork12)
// The Beer Kitchen
let artwork13 = Artwork(title: "The Beer Kitchen",
locationName: "10 S Tay St",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.457705, longitude: -2.975928000000067),
venueNo:13)
mapView.addAnnotation(artwork13)
// Braes
let artwork14 = Artwork(title: "Braes",
locationName: "Perth Rd",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.45660329999999, longitude: -2.9789081000000124),
venueNo:14)
mapView.addAnnotation(artwork14)
// The Nether Inn
let artwork15 = Artwork(title: "Nether Inn",
locationName: "134 Nethergate",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4580593, longitude: -2.974011799999971),
venueNo:15)
mapView.addAnnotation(artwork15)
// The Underground
let artwork16 = Artwork(title: "Underground",
locationName: "25 S Tay St",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4583296, longitude: -2.975921200000016),
venueNo:16)
mapView.addAnnotation(artwork16)
// George Orwell
let artwork17 = Artwork(title: "George Orwell",
locationName: "168 Perth Rd",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4561959, longitude: -2.986077499999965),
venueNo:17)
mapView.addAnnotation(artwork17)
// Balcony Bar
let artwork18 = Artwork(title: "Balcony Bar",
locationName: "5 Ward Rd",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4618648, longitude: -2.9748177999999825),
venueNo:18)
mapView.addAnnotation(artwork18)
// McDaniels
let artwork19 = Artwork(title: "McDaniels",
locationName: "34-36 Whitehall Cres",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.45888000000001, longitude: -2.969510000000014),
venueNo:19)
mapView.addAnnotation(artwork19)
// TheWest House
let artwork20 = Artwork(title: "The West House",
locationName: "2 West Port",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.45932519999999, longitude: -2.977865299999962),
venueNo:20)
mapView.addAnnotation(artwork20)
centerMapOnLocation(location: initialLocation)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
extension MapContollerViewController: MKMapViewDelegate {
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView,
calloutAccessoryControlTapped control: UIControl) {
//* load page on click
print("button tapped",venueNo)
//working on this
if venueNo == 1{
performSegue(withIdentifier: "Home", sender: self)
}
if venueNo == 2{
performSegue(withIdentifier: "TinSmith", sender: self)
}
}
// 1
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
// 2
guard let annotation = annotation as? Artwork else { return nil }
// 3
let identifier = "marker"
var view: MKMarkerAnnotationView
// 4
if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
as? MKMarkerAnnotationView {
dequeuedView.annotation = annotation
view = dequeuedView
} else {
// 5
view = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)
view.canShowCallout = true
view.calloutOffset = CGPoint(x: -5, y: 5)
view.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
}
return view
}
}
和处理注释的脚本
import Foundation
import MapKit
import Contacts
class Artwork: NSObject, MKAnnotation {
let title: String?
let locationName: String
let discipline: String
let coordinate: CLLocationCoordinate2D
let venueNo: Int
init(title: String, locationName: String, discipline: String, coordinate: CLLocationCoordinate2D, venueNo : Int) {
self.title = title
self.locationName = locationName
self.discipline = discipline
self.coordinate = coordinate
self.venueNo = (venueNo)
super.init()
}
var subtitle: String? {
return locationName
}
}
我是 Swift 的新手,希望有人能提供帮助。我已经尝试解决 5 天了,所以我想寻求帮助。
您可以根据作品的 venueNo 区分注释 属性:
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView,
calloutAccessoryControlTapped control: UIControl) {
guard let artwork = view.annotation as? Artwork else { return }
let annotaionVenueNo = artwork.venueNo
print("veneueNo = %d", annotaionVenueNo)
// do additional process depend on annotaionVenueNo
}
我的地图上有 20 个图钉,点击每个图钉时都会显示带有场地名称的注释,并且在右侧有一个标注按钮。我已经使用 segue 成功地将此按钮 link 编辑到单个页面。问题是所有位置都 link 到同一页面。我想要 20 个单独的页面,每个 link 到一个特定的 pin。我在网上找到的几乎所有示例都希望生成一个包含传入信息的页面。这是我的代码。
import UIKit
import MapKit
import CoreLocation
class MapContollerViewController: UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var mapView: MKMapView!
// NEED TO SET THIS INT SOMEWHERE DEPENDING ON WHICH LOCATION IS SELECTED
var venueNo: Int = 2
// MARK: - CLLocationManager
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
checkLocationAuthorizationStatus()
}
let locationManager = CLLocationManager()
func checkLocationAuthorizationStatus() {
if CLLocationManager.authorizationStatus() == .authorizedAlways {
mapView.showsUserLocation = true
} else {
locationManager.requestAlwaysAuthorization()
}
}
let regionRadius: CLLocationDistance = 800
func centerMapOnLocation(location: CLLocation) {
let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate,
regionRadius, regionRadius)
mapView.setRegion(coordinateRegion, animated: true)
}
override func viewDidLoad() {
let classInstance = MapContollerViewController() //swift allocates memory and creates an instance
classInstance.venueNo = 2
super.viewDidLoad()
mapView.delegate = self
let initialLocation = CLLocation(latitude: 56.457539, longitude: -2.9821680000000015)
//UNION
let artwork = Artwork(title: "The Union",
locationName: "Airlie Place",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.457539, longitude: -2.9821680000000015),
venueNo:1)
//changing value here but in wrong place
venueNo = 1
mapView.addAnnotation(artwork)
// TINSMITH
let artwork2 = Artwork(title: "The Tin Smith",
locationName: "11-13 Old Hawkhill",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4594785, longitude: -2.980198400000063),
venueNo:2)
mapView.addAnnotation(artwork2)
// Grafters
let artwork3 = Artwork(title: "Grafters",
locationName: "Union Street",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4588498, longitude: -2.9709077999999636),
venueNo:3)
mapView.addAnnotation(artwork3)
// The Bird & Bear
let artwork4 = Artwork(title: "The Bird & Bear",
locationName: "2 Whitehall Cres",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4592973, longitude: -2.968744700000002),
venueNo:4)
mapView.addAnnotation(artwork4)
// The Salty Dog
let artwork5 = Artwork(title: "The Salty Dog",
locationName: "9 Crichton St",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.459916, longitude: -2.9701755999999477),
venueNo:5)
mapView.addAnnotation(artwork5)
// Jam Jar
let artwork6 = Artwork(title: "Jam Jar",
locationName: "2b Whitehall Cres",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.45916279999999, longitude: -2.9688820999999734),
venueNo:6)
mapView.addAnnotation(artwork6)
// Church
let artwork7 = Artwork(title: "Church",
locationName: "15 Ward Rd",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4617273, longitude: -2.9758415000000014),
venueNo:7)
mapView.addAnnotation(artwork7)
// No'1s
let artwork8 = Artwork(title: "No'1s",
locationName: "1 Ward Rd",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4618699, longitude: -2.9745715000000246),
venueNo:8)
mapView.addAnnotation(artwork8)
// Medina
let artwork9 = Artwork(title: "Medina",
locationName: "113 Nethergate",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4576889, longitude: -2.9751609),
venueNo:9)
mapView.addAnnotation(artwork9)
// Westport
let artwork10 = Artwork(title: "Westport Bar",
locationName: "N Lindsay St",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4606814, longitude: -2.975895000000037),
venueNo:10)
mapView.addAnnotation(artwork10)
// D'Arcy thompson
let artwork11 = Artwork(title: "D'Arcy Thompson",
locationName: "Old Hawkhill",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4594204, longitude: -2.9805648999999903),
venueNo:11)
mapView.addAnnotation(artwork11)
// Tonic
let artwork12 = Artwork(title: "Tonic",
locationName: "141 Nethergate",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4572926, longitude: -2.9762908000000152),
venueNo:12)
mapView.addAnnotation(artwork12)
// The Beer Kitchen
let artwork13 = Artwork(title: "The Beer Kitchen",
locationName: "10 S Tay St",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.457705, longitude: -2.975928000000067),
venueNo:13)
mapView.addAnnotation(artwork13)
// Braes
let artwork14 = Artwork(title: "Braes",
locationName: "Perth Rd",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.45660329999999, longitude: -2.9789081000000124),
venueNo:14)
mapView.addAnnotation(artwork14)
// The Nether Inn
let artwork15 = Artwork(title: "Nether Inn",
locationName: "134 Nethergate",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4580593, longitude: -2.974011799999971),
venueNo:15)
mapView.addAnnotation(artwork15)
// The Underground
let artwork16 = Artwork(title: "Underground",
locationName: "25 S Tay St",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4583296, longitude: -2.975921200000016),
venueNo:16)
mapView.addAnnotation(artwork16)
// George Orwell
let artwork17 = Artwork(title: "George Orwell",
locationName: "168 Perth Rd",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4561959, longitude: -2.986077499999965),
venueNo:17)
mapView.addAnnotation(artwork17)
// Balcony Bar
let artwork18 = Artwork(title: "Balcony Bar",
locationName: "5 Ward Rd",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.4618648, longitude: -2.9748177999999825),
venueNo:18)
mapView.addAnnotation(artwork18)
// McDaniels
let artwork19 = Artwork(title: "McDaniels",
locationName: "34-36 Whitehall Cres",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.45888000000001, longitude: -2.969510000000014),
venueNo:19)
mapView.addAnnotation(artwork19)
// TheWest House
let artwork20 = Artwork(title: "The West House",
locationName: "2 West Port",
discipline: "Venue",
coordinate: CLLocationCoordinate2D(latitude: 56.45932519999999, longitude: -2.977865299999962),
venueNo:20)
mapView.addAnnotation(artwork20)
centerMapOnLocation(location: initialLocation)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
extension MapContollerViewController: MKMapViewDelegate {
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView,
calloutAccessoryControlTapped control: UIControl) {
//* load page on click
print("button tapped",venueNo)
//working on this
if venueNo == 1{
performSegue(withIdentifier: "Home", sender: self)
}
if venueNo == 2{
performSegue(withIdentifier: "TinSmith", sender: self)
}
}
// 1
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
// 2
guard let annotation = annotation as? Artwork else { return nil }
// 3
let identifier = "marker"
var view: MKMarkerAnnotationView
// 4
if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
as? MKMarkerAnnotationView {
dequeuedView.annotation = annotation
view = dequeuedView
} else {
// 5
view = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)
view.canShowCallout = true
view.calloutOffset = CGPoint(x: -5, y: 5)
view.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
}
return view
}
}
和处理注释的脚本
import Foundation
import MapKit
import Contacts
class Artwork: NSObject, MKAnnotation {
let title: String?
let locationName: String
let discipline: String
let coordinate: CLLocationCoordinate2D
let venueNo: Int
init(title: String, locationName: String, discipline: String, coordinate: CLLocationCoordinate2D, venueNo : Int) {
self.title = title
self.locationName = locationName
self.discipline = discipline
self.coordinate = coordinate
self.venueNo = (venueNo)
super.init()
}
var subtitle: String? {
return locationName
}
}
我是 Swift 的新手,希望有人能提供帮助。我已经尝试解决 5 天了,所以我想寻求帮助。
您可以根据作品的 venueNo 区分注释 属性:
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView,
calloutAccessoryControlTapped control: UIControl) {
guard let artwork = view.annotation as? Artwork else { return }
let annotaionVenueNo = artwork.venueNo
print("veneueNo = %d", annotaionVenueNo)
// do additional process depend on annotaionVenueNo
}