Swift Everyday
Swift Everyday

Reputation: 281

UILongPressGestureRecognizer issue when adding to MKMapView

I am still new to swift and is trying to figure out how to add a long press gesture annotation on a mapview.

However, I kept getting this error:

libc++abi.dylib: terminating with uncaught exception of type NSException

Is there something wrong with my addAnotation func?

Thanks in advance.

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    manager = CLLocationManager()
    manager.delegate = self
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.requestWhenInUseAuthorization()
    manager.startUpdatingLocation()

    // action = A selector that identifies the method implemented by the target to handle the gesture recognized by the receiver. The action selector must conform to the signature described in the class overview. NULL is not a valid value.
    var uilpgr = UILongPressGestureRecognizer(target: self, action: "addAnotation")
    uilpgr.minimumPressDuration = 2.0
    map.addGestureRecognizer(uilpgr)
}

func addAnotation(gestureRecognizer:UIGestureRecognizer)
{
    if(gestureRecognizer.state == UIGestureRecognizerState.Began)
    {
        //locationInView = Returns the point computed as the location in a given view of the gesture represented by the receiver.
        var touchPoint = gestureRecognizer.locationInView(self.map)

        //convertPoint = convert a point from map to coordinate
        var newCoordinate = self.map.convertPoint(touchPoint, toCoordinateFromView: self.map)

        var annotation = MKPointAnnotation()

        annotation.coordinate = newCoordinate
        annotation.title = "New Annotation"
        self.map.addAnnotation(annotation)
    }
}

Here is the full code for your reference:

import UIKit
import MapKit

class ViewController: UIViewController, CLLocationManagerDelegate {

@IBOutlet var map: MKMapView!

var manager: CLLocationManager!


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    manager = CLLocationManager()
    manager.delegate = self
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.requestWhenInUseAuthorization()
    manager.startUpdatingLocation()

    // action = A selector that identifies the method implemented by the target to handle the gesture recognized by the receiver. The action selector must conform to the signature described in the class overview. NULL is not a valid value.
    var uilpgr = UILongPressGestureRecognizer(target: self, action: "addAnotation")
    uilpgr.minimumPressDuration = 2.0
    map.addGestureRecognizer(uilpgr)
}

func addAnotation(gestureRecognizer:UIGestureRecognizer)
{
    if(gestureRecognizer.state == UIGestureRecognizerState.Began)
    {
        //locationInView = Returns the point computed as the location in a given view of the gesture represented by the receiver.
        var touchPoint = gestureRecognizer.locationInView(self.map)

        //convertPoint = convert a point from map to coordinate
        var newCoordinate = self.map.convertPoint(touchPoint, toCoordinateFromView: self.map)

        var annotation = MKPointAnnotation()

        annotation.coordinate = newCoordinate
        annotation.title = "New Annotation"
        self.map.addAnnotation(annotation)
    }
}



func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    print(locations)
    var userLocation:CLLocation = locations[0]
    var latitude = userLocation.coordinate.latitude
    var longitude = userLocation.coordinate.longitude
    var coordinate = CLLocationCoordinate2DMake(latitude, longitude)

    var latDelta:CLLocationDegrees =  0.01
    var lonDelta:CLLocationDegrees = 0.01
    var span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta) // MKCoordinateSpan = A structure that defines the area spanned by a map region.

    // Mk CoordinateRegion = A structure that defines which portion of the map to display.
    var region:MKCoordinateRegion = MKCoordinateRegionMake(coordinate, span)

    self.map.setRegion(region, animated: true)
}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

Upvotes: 1

Views: 774

Answers (1)

James Zaghini
James Zaghini

Reputation: 4001

You just need to add a colon after addAnotation:

var uilpgr = UILongPressGestureRecognizer(target: self, action: "addAnotation:")

In your version where you omit the colon, a method with this signature will be called. Note there are no parameters

func addAnotation()

So your UILongPressGestureRecognizer is attempting to a call the above method, which is undefined and that is causing your application to throw an exception

Upvotes: 1

Related Questions