添加到MKMapView时出现UILongPressGestureRecognizer问题

时间:2015-12-17 05:39:52

标签: ios iphone swift swift2

我还是swift的新手,正试图找出如何在mapview上添加长按手势注释。

但是,我一直收到这个错误:

  

libc ++ abi.dylib:以未捕获的类型异常终止   NSException

我的addAnotation func有问题吗?

提前致谢。

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)
    }
}

以下是供您参考的完整代码:

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.
}


}

1 个答案:

答案 0 :(得分:1)

您只需在addAnotation之后添加冒号:

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

在省略冒号的版本中,将调用具有此签名的方法。注意没有参数

func addAnotation()

所以你的UILongPressGestureRecognizer试图调用上面的方法,这是未定义的,导致你的应用程序抛出异常