2016-07-28 78 views
1

目前我有一个地图视图设置了5个硬编码位置,这些位置在地图上用引脚显示。当用户点击这些引脚时,会向用户显示标注位置的详细信息。在这些标注中,我试图包含一个用户可以按下的按钮,然后将它们带到另一个视图控制器。iOS - Swift - 如何添加一个按钮到MKPointAnnotaton - MapKit

下面是我有的当前代码,但是当我点击引脚时没有显示任何按钮,有没有人有任何想法我缺少什么或为了实现按钮需要做什么?

这是我的位置和当前用户位置的代码。

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) 

} 

这里是标注中的按钮实现的代码(不工作)

func MapView(mapview: MKMapView!, annotationView view: MKAnnotationView!, calloutAccessoryTapped control: UIControl!) { 
    if control == view.rightCalloutAccessoryView { 
     print(view.annotation?.title) 
     print(view.annotation?.subtitle) 

     //Perform segue to navigate to viewcontroller 
    } 
} 

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 
    } 

    var button = UIButton(type: .DetailDisclosure) as UIButton 

    pinView?.rightCalloutAccessoryView = button 

    return pinView 

} 

我可能失去了一些东西很简单,但我不知道是什么。我对iOS/Swift开发和MapKit都很陌生,所以请耐心等待。我也明白,这个问题多次被问过,我仍然无法解决这个问题。任何帮助表示赞赏,谢谢。

+0

选中此相关的帖子了..> http://stackoverflow.com/questions/28225296/how-to-add-a-button-to-mkpointannotation – HowsThatMonkey

+0

嗨,我已经使用这个职位和综合将代码添加到我的应用程序中并进行必要的更改。感谢您的评论,我很感激。 – starrybolt

回答

0

您在以下标注方法中犯了一个小错误,您明确解开了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 
} 
+0

您好,感谢您的帮助。我做了你在帖子中陈述的改变,但它仍然不起作用,它仍然只显示标注和信息,没有按钮。还有什么我错了吗? – starrybolt

+0

嗨,请忽略我最后的评论,因为我现在已解决此问题。非常感谢您的帮助,我花了2天的时间尝试解决此问题。 – starrybolt

+0

你是如何解决它的? – Burf2000

相关问题