2015-01-14 91 views
0

我正在學習Swift,希望創建一個MKMapKit的子類來封裝一些特定的功能,如檢查兩點之間的距離並創建自定義註釋並將所有地圖代碼分隔到一個類中。Swift自定義地圖類

我已經創建了一個類:

class GameMapViewController: MKMapView, MKMapViewDelegate{...} 

我發起在主視圖控制器代碼的類(和將其添加爲子視圖的故事板的視圖,所以我可以控制它更容易):

gameMap = GameMapViewController(container: mapViewHolder) 

其完成所有設置確定,所有的作品,除了當我想從一個自定義的註釋觸發賽格瑞:

​​

didSelectAnnotationView被調用,當我在註釋標註挖掘,但沒有有法performSegueWithIdentifier,我在尋找,所有的solutionssimilar問題,建議我應該使用....

(我試圖把一個MapKit查看到故事板並更改它的類以使用GameMapViewController,但沒有任何初始化函數被觸發)

我在猜測它是如何初始化我的自定義類的?

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

} 

}

回答

2

這是因爲你混淆的觀點和看法控制器。你有一個視圖(子類MKMapView,但你命名它,並試圖使用它作爲一個控制器。這也是一個控制器的工作

所以,你應該真的有一個視圖控制器擁有和配置一個地圖視圖(plain MKMapView),然後它可以與segues交互。

+0

是的,我確實讓他們感到困惑,感謝您的輸入,現在全部排序。 – bba13