【发布时间】:2015-12-17 05:39:52
【问题描述】:
我还是 swift 新手,正在尝试弄清楚如何在地图视图上添加长按手势注释。
但是,我一直收到此错误:
libc++abi.dylib:以未捕获的类型异常终止 NSException
我的 addAnotation 函数有问题吗?
提前致谢。
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.
}
}
【问题讨论】: