目前我有一个地图视图,其中设置了5个硬编码位置,这些位置在地图上显示了引脚。当用户点击这些引脚时,会向用户显示一个标注,其中包含该位置的详细信息。在这些标注中,我试图包含一个用户可以按下的按钮,然后将它们带到另一个视图控制器。
下面是我当前的代码,但是当我点击引脚时没有显示按钮,是否有人知道我缺少什么或者我需要做什么才能实现按钮?
以下是我的位置代码和当前用户位置。
&> # redirects stdout and stderr
>(cmd) # redirects to a process
这是callout中按钮实现的代码(不起作用)
import UIKit
import MapKit
import CoreLocation
import SceneKit
class SecondViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate
{
@IBOutlet weak var mapView: MKMapView!
//Location manager property
let locationManager = CLLocationManager()
override func viewDidLoad()
{
super.viewDidLoad()
mapView.delegate = self
//Find the current location as soon as the view is loaded
self.locationManager.delegate = self
//Setting the accuracy
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
//So only location services are used within the app
self.locationManager.requestWhenInUseAuthorization()
//Start up the location manager and find current location
self.locationManager.startUpdatingLocation()
//Use blue pin to show the location to the user
self.mapView.showsUserLocation = true
//Array of dictionaries to store the locations
let locationData = [
//Radio City Tower
["name": "Radio City Tower",
"latitude": 53.4071551,
"longitude": -2.980798600000071],
//Metropolitian Cathedral
["name": "Metropolitian Catherdral",
"latitude": 53.40494649999999,
"longitude": -2.9684022999999797],
//Walker Art Gallery
["name": "Walker Art Gallery",
"latitude": 53.410068,
"longitude": -2.979666],
//Liver Buildings
["name": "Liver Buildings",
"latitude": 53.405808,
"longitude": -2.995859],
//St George's Hall
["name": "St George's Hall",
"latitude": 53.409277,
"longitude": -2.979946]
]
//Object for each dictionary in the locations array
var annotations = [MKPointAnnotation]()
//Populating the map with the location pins
for Dictionary in locationData {
let latitude = CLLocationDegrees(Dictionary["latitude"] as! Double)
let longitude = CLLocationDegrees(Dictionary["longitude"] as! Double)
let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
let name = Dictionary["name"] as! String
let annotation = MKPointAnnotation()
//Apply to annotation
annotation.coordinate = coordinate
annotation.title = "\(name)"
annotations.append(annotation)
}
mapView.addAnnotations(annotations)
}
override func didReceiveMemoryWarning()
{
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Location Delegate Methods
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
//Gets the most current location
let location = locations.last
//gets the center of the last location
let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)
//Creatng a region - Map will zoom to this
let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: Double(0.004), longitudeDelta: Double(0.004)))
//Apply the map view to the region
self.mapView.setRegion(region, animated: true)
//Stop updating the location
self.locationManager.stopUpdatingLocation()
let currentLocation = CLLocationCoordinate2DMake(location!.coordinate.latitude, location!.coordinate.longitude)
//Adding an annotation to current user location
var pinAnnotation = MKPointAnnotation()
//Set pin coordinate to the users current location
pinAnnotation.coordinate = currentLocation
//Annotation title
pinAnnotation.title = "Current Location"
//Annotation subtitle
pinAnnotation.subtitle = "You are here!"
//Add the pin to the mapView
mapView.addAnnotation(pinAnnotation)
}
我可能错过了一些非常简单的东西,但我不确定是什么。我是iOS / Swift开发的新手,也是MapKit,所以请耐心等待。我也明白这个问题已被多次询问,但我仍然无法解决这个问题。感谢任何帮助,谢谢。
答案 0 :(得分:0)
你在下面的callout方法中犯了一个小错误,你明确地解开了 MKAnnotationView!和 MKMapView!。这是我已经测试过的更正的。
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
print("viewForAnnotation")
if(annotation is MKUserLocation) {
return nil
}
let reuseID = "pin"
var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseID) as? MKPinAnnotationView
if(pinView == nil) {
pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseID)
pinView!.canShowCallout = true
pinView!.animatesDrop = true
}
let button = UIButton()
button.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
let image = UIImage(named: "img.png")
button.setImage(image, forState: .Normal)
pinView?.rightCalloutAccessoryView = button
return pinView
}