我正在学习Swift,并且想创建一个MKMapKit的子类来封装某些特定功能,例如检查两点之间的距离并创建自定义注释,并将所有地图代码分成一个类。

我创建了一个类:

class GameMapViewController: MKMapView, MKMapViewDelegate{...}

我在主视图控制器中的代码中初始化类(并将其作为子视图添加到情节提要上的视图,以便可以更轻松地控制它的位置):

gameMap = GameMapViewController(container: mapViewHolder)

当我想从自定义注释中触发segue时,一切设置都正常,并且所有工作都可以进行:

func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!) {...}

当我点击注释标注时, didSelectAnnotationView会被调用,但是我没有正在寻找的方法performSegueWithIdentifier ,所有针对类似问题的解决方案都建议我使用...。

(我尝试过将MapKit View放在情节提要上,并更改其类以使用GameMapViewController但没有GameMapViewController任何init函数)

我在猜测如何初始化自定义类?

MainViewController.swift:

override func viewDidLoad() {
super.viewDidLoad()
....
// Create the game map
gameMap = GameMapViewController(container: mapViewHolder)
mapViewHolder.addSubview(gameMap)

...

}

GameMapViewController.swift:

import UIKit
import MapKit


class GameMapViewController: MKMapView, MKMapViewDelegate{

var spanQuestion:MKCoordinateSpan = MKCoordinateSpanMake(180, 180)
var spanAnswer:MKCoordinateSpan = MKCoordinateSpanMake(180, 180)
var hasUserCityLocationGuess: Bool = false

var containingView: UIView

override init(){
    println ("GameMapViewController init")
    containingView = UIView()
    super.init(frame: CGRect(x: 0, y: 0, width: 1000, height: 1000))

    self.delegate=self
    var latDeltaAnswer:CLLocationDegrees = 50
    var lngDeltaAnswer:CLLocationDegrees = 50
    spanAnswer = MKCoordinateSpanMake(latDeltaAnswer, lngDeltaAnswer)

    var latDeltaQuestion:CLLocationDegrees = 180
    var lngDeltaQuestion:CLLocationDegrees = 180
    spanQuestion = MKCoordinateSpanMake(latDeltaQuestion, lngDeltaQuestion)



}

required init(coder aDecoder: NSCoder) {
    containingView = UIView()
    super.init(coder: aDecoder)
    self.delegate = nil
    println ("GameMapViewController init with decoder")
}


convenience init(container: UIView) {
    println ("GameMapViewController convenience")
    self.init()
    self.delegate = self
    containingView = container


}

func mapViewDidFinishLoadingMap(mapView: MKMapView!) {
    println("mapViewDidFinishLoadingMap")
}

func mapViewWillStartLoadingMap(mapView: MKMapView!) {

    self.frame = CGRect (x: 0, y: 0, width: containingView.frame.width, height: containingView.frame.height)
    self.contentMode = UIViewContentMode.ScaleAspectFill
    superview?.sizeToFit()
    var guessPlaceRecognizer = UILongPressGestureRecognizer(target: self, action: "guessPlace:")
    guessPlaceRecognizer.minimumPressDuration = 1.0
    mapView.addGestureRecognizer(guessPlaceRecognizer)
    mapView.mapType = MKMapType.Satellite

}

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
    if overlay is MKCircle {
        var circleRenderer = MKCircleRenderer(overlay: overlay)
        circleRenderer.strokeColor = UIColor.redColor()
        circleRenderer.fillColor = UIColor(red: 255, green: 0, blue: 0, alpha: 0.1)
        circleRenderer.lineWidth = 1
        //userOverlayCircleRender = circleRenderer
        return circleRenderer
    } else {
        return nil
    }
}

func guessPlace(gestureRecognizer:UIGestureRecognizer){

    let guessPlaceFirst = NSUserDefaults.standardUserDefaults().boolForKey("guess_place_preference")

    if guessPlaceFirst {
        var touchPoint = gestureRecognizer.locationInView(self)
        var newCoord:CLLocationCoordinate2D = self.convertPoint(touchPoint, toCoordinateFromView: self)
        var userAnnotation = UserPointAnnotation()
        userAnnotation.coordinate = newCoord
        self.addAnnotation(userAnnotation)


        var getLat: CLLocationDegrees = newCoord.latitude
        var getLon: CLLocationDegrees = newCoord.longitude
        var circleCenter: CLLocation =  CLLocation(latitude: getLat, longitude: getLon)
        addRadiusCircle(circleCenter)
        hasUserCityLocationGuess = true
    }

}

func showCity() {
    let location = CLLocationCoordinate2D(latitude: (currentCity["latitude"]! as CLLocationDegrees), longitude: (currentCity["longitude"]! as CLLocationDegrees))
    let region:MKCoordinateRegion = MKCoordinateRegionMake(location, self.spanAnswer)
    let city: String = currentCity["city"]! as String
    let conditions: String = currentCity["description"] as String
    let country: String = currentCity["country"]! as String
    let address = "\(city), \(country)"
    let cityAnnotation = CityPointAnnotation()

    cityAnnotation.title = address
    cityAnnotation.subtitle = "\(conditions)"
    cityAnnotation.coordinate = location


    self.setRegion(region, animated: true)
    self.addAnnotation(cityAnnotation)
    self.selectAnnotation(cityAnnotation, animated: true)


}

func cityInfoClick(sender:UIButton){
    //sender.performSegueWithIdentifier("segueCityWebView")
}




func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
    // Handle any custom annotations.

    if annotation is CityPointAnnotation {

        // Try to dequeue an existing pin view first.
        let reuseId = "CityPointAnnotationView"
        var annotationView = self.dequeueReusableAnnotationViewWithIdentifier(reuseId)
        if annotationView == nil {
            annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
            annotationView.image = UIImage(named: "marker.png")
            annotationView.rightCalloutAccessoryView = UIButton.buttonWithType(.InfoDark) as UIButton
            annotationView.canShowCallout = true
            return annotationView;

        } else {

            annotationView.annotation = annotation
        }

        return annotationView

    }
    return nil;
}

func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!) {
    println("didSelectAnnotationView")
}

func mapView(mapView: MKMapView!, annotationView view: MKAnnotationView!, calloutAccessoryControlTapped control: UIControl!) {
    println("calloutAccessoryControlTapped1")

    ///////////////////
    // I want to do a segue here
    // but nothing has the method performSegueWithIdentifier (self, mapView, control....)
    ///////////////////


}


func resetMap(){
    self.removeAnnotations(self.annotations)
    self.removeOverlays(self.overlays)
    var region:MKCoordinateRegion = MKCoordinateRegionMake(self.centerCoordinate, spanQuestion)
    self.setRegion(region, animated: true)
    hasUserCityLocationGuess = false

}
func addRadiusCircle(location: CLLocation){

    var radius = NSUserDefaults.standardUserDefaults().doubleForKey("guess_place_radius") as CLLocationDistance
    var circle = MKCircle(centerCoordinate: location.coordinate, radius: radius )

    self.removeOverlays(self.overlays)
    self.addOverlay(circle)


}

func doGeoCode( cityObject:PFObject ) -> Bool {
    ....
}

func userCityLocationGuess(userGuessTemp:Int)->NSDictionary {
    ....

}

}

#1楼 票数:2 已采纳

这是因为您混淆了视图和视图控制器。 您有一个视图( MKMapView子类,但您正在命名该视图并尝试将其用作控制器。它也可以完成控制器的工作。

因此,您实际上应该有一个拥有并配置地图视图(纯MKMapView )的视图控制器,然后它可以与segue交互。

  ask by bba13 translate from so

未解决问题?本站智能推荐:

2回复

在将calloutAccessoryView用作新ViewController的segue发件人时,如何访问自定义批注属性?

我有以下代码为我的转场做准备: 我们将重点放在声明中的“else if”部分。 我有一个自定义注释和注释视图。 我正在使用用户单击以显示 rightCalloutAccessoryView 的 .detailDisclosure 版本的注释的属性,在我要使用的视图控制器中填充标签和图像视图。 但是,
1回复

通过点击地图注释上的右侧附件标注按钮来快速选择视图

我对快速进行面向对象的编程非常陌生,我试图通过点击长按掉下的图钉注释中的右侧辅助标注按钮,将视图从包含地图的视图切换到另一个视图。 在情节提要中,我在两个视图之间创建了一个序列,并为序列分配了标识符mapseg。 不幸的是,在尝试了所有我可以通过Google找到的东西之后,当我点击正确的附件
1回复

搜索回到原始地图后,注释图钉会重置(MapkitSwift)

我正在使用MapKit的本地搜索功能根据用户的搜索填充一堆图钉注释。 单击图钉时,在标注中,您将转到该位置的详细信息视图控制器。 当用户搜索并单击工具栏上的从detailviewcontroller到前一个viewcontroller的后退按钮时,所有注释钉都消失了。 有什么办法可以避免这
1回复

通过数据从地图标注中的detailDisclosure按钮传递数据到新的DetailView

我已经使用JSON文件在MapView上填充了几个引脚。 这些针脚中的每一个都能正确显示带有标题,字幕,图像和detailDisclosure按钮的标注。 我试图在MapView和Detail View(安排为TableView)之间创建一个序列,以便当用户单击detailDisclosu
1回复

快速拖动地图或更改缩放级别时,MapKit上的自定义群集注释会崩溃

在实现了一种对自定义注释进行聚类的方法后,只要通过滚动或更改缩放级别来快速调整地图视图,应用程序就会崩溃。 -[MKPointAnnotation memberAnnotations]:无法识别的选择器发送到实例 0x281396c00 我的猜测是编译器正在尝试检索注释信息,但找不到数据。 由于
1回复

自定义地图注释

我已经使我所有的图钉都具有可重复使用的图像作为它们的图像,但是我不希望用户位置的图钉具有此图像,我只想要默认的蓝色圆圈。 有办法可以做到吗? 以下是我用来为图钉创建自定义图像的代码。
1回复

快速定制自定义权利

我试图从两个视图控制器中获得正确的选择,问题是当它进行过渡时,第一个视图控制器进行了选择,但似乎在短时间内几乎重叠了一下,然后放置了新视图控制器就可以了。 我在网上看过其他帖子,似乎没有人遇到这个问题。 我在以下图片中包含了该路线。 源使用的是UINavController,该UINav
2回复

快速(MapKit)上的自定义标记图片

我在 MapKit 上使用自定义标记如何更改自定义标记上的图像宽度和高度? 我的代码: