我还是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.
}
}
答案 0 :(得分:1)
您只需在addAnotation
之后添加冒号:
var uilpgr = UILongPressGestureRecognizer(target: self, action: "addAnotation:")
在省略冒号的版本中,将调用具有此签名的方法。注意没有参数
func addAnotation()
所以你的UILongPressGestureRecognizer
试图调用上面的方法,这是未定义的,导致你的应用程序抛出异常