Swift - adding a button to my MKPointAnnotation

不想你离开。 提交于 2019-12-11 12:00:00

问题


On Swift 1.2 : I'd like to add a button to my annotations on the map. First tap on pin shows user's id, and this is working, but then, by pressing the button, I want to send the user to a detail view controller.

you can have an idea of what I'm looking for here and here

tried to apply those solutions, but I think I'm missing something. This is another example of what I'm seeking

this is my class declaration:

import UIKit
import MapKit
import CoreLocation
import Parse

class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate, UIActionSheetDelegate {

and this is the part of the code where I'd like to create annotations with buttons:

    // MARK: - Create Annotation

    func createAnnotations(point: PFGeoPoint, address: String)
    {
        println("*** this evaluates n.3 ***")
        var query = PFUser.query()


        query?.whereKey("location", nearGeoPoint: point, withinKilometers: withinKms)
        query?.orderByAscending("location")  //MARK:  Put list in order

        //MARK: Not include current user on the map
        var me = PFUser.currentUser()?.username
        query?.whereKey("username", notEqualTo: me!)

        query?.limit = self.kLimitNumberForQueryResults


        query?.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in

            if error == nil
            {
                for(var i = 0; i < objects!.count; i++) {

                    let user = objects![i] as! PFUser
                    var myHomePin = MKPointAnnotation()
                    let userPoint = user["location"] as! PFGeoPoint
                    myHomePin.coordinate = CLLocationCoordinate2DMake(userPoint.latitude, userPoint.longitude)
                    myHomePin.title = user.username

 //MARK: core of the problem                   
//                    let detailButton : UIButton = UIButton.buttonWithType(UIButtonType.DetailDisclosure) as! UIButton
//                    myHomePin.rightCalloutAccessoryView = detailButton
//




//                    myHomePin.subtitle = address
                    self.mapView.addAnnotation(myHomePin)
                    //                    self.closeUsersArray.append(user.username!) //MARK: Test

                }






//                    println("this is the array of users * \(self.closeUsersArray) *") //MARK: Test
            }
            else
            {
                println("Error: " + error!.localizedDescription)
            }

        })

    }

thanks in advance!


回答1:


Use the 'viewForAnnotation' map view delegate method to setup left and rightcalloutAccessories. and also UIButton.buttonWithType is replaced, this will work: Edit: all delegate methods you need but I didn't though your createAnnotation function because you said its working fine

class MapViewController: UIViewController, MKMapViewDelegate //
{
    @IBOutlet weak var mapView: MKMapView!{ //make sure this outlet is connected 
        didSet{
            mapView.delegate = self
        }
    }

    // MARK: - Map view delegate

    func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
        var view = mapView.dequeueReusableAnnotationViewWithIdentifier("AnnotationView Id")
        if view == nil{
            view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "AnnotationView Id")
            view!.canShowCallout = true
        } else {
            view!.annotation = annotation
        }

        view?.leftCalloutAccessoryView = nil
        view?.rightCalloutAccessoryView = UIButton(type: UIButtonType.DetailDisclosure)
        //swift 1.2
        //view?.rightCalloutAccessoryView = UIButton.buttonWithType(UIButtonType.DetailDisclosure) as UIButton

        return view
    }

    func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
        //I don't know how to convert this if condition to swift 1.2 but you can remove it since you don't have any other button in the annotation view
        if (control as? UIButton)?.buttonType == UIButtonType.DetailDisclosure { 
                mapView.deselectAnnotation(view.annotation, animated: false)
                performSegueWithIdentifier("you're segue Id to detail vc", sender: view)
            }
        } 
    }

    //Your function to load the annotations in viewDidLoad

}


来源:https://stackoverflow.com/questions/33123724/swift-adding-a-button-to-my-mkpointannotation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!