2016-07-28 14 views
1

Ich versuche, die gleiche Logik für verschiedene Registerkarten in iOS-Anwendung zu implementieren, aber Thread 1: EXC_BAD_INSTRUCTION (Code = EXC_1386_INVOP, Subcode 0x0). Es ist eine einfache Anwendung, die es dem Benutzer ermöglichen soll, einige Punkte auf der Karte zu markieren (gerade jetzt mit Anmerkungen) und dazwischen Linien zu ziehen.Swift EXC_BAD_INSTRUCTION beim Versuch, Delegat zu verwenden

Klasse, die Logik enthält:

class MapController : NSObject, MKMapViewDelegate{ 

    var Map: MKMapView! 

    var points : [CGPoint] 

    init(_Map : MKMapView!, delClass : String)//, coder aDecoder: NSCoder) 
    { 
     self.Map = _Map 
     points = [CGPoint]() 

     self.Map.mapType = MKMapType.Satellite 


     let centre = CLLocationCoordinate2D(latitude: 40.0000000, 
              longitude: 49.0000000) 

     let span = MKCoordinateSpan(latitudeDelta: 10.01, 
            longitudeDelta: 10.01) 

     let region = MKCoordinateRegion(center: centre, span: span) 
     self.Map.setRegion(region, animated: false) 
     self.Map.regionThatFits(region) 


     let urlTemplate = "http://someip/mapcache/tms/1.0.0/[email protected]/{z}/{x}/{y}.png" 

     let carte_indice = MKTileOverlay(URLTemplate: urlTemplate) 

     carte_indice.geometryFlipped = true 

     carte_indice.canReplaceMapContent = false 
     print("Map") 
     self.Map.addOverlay(carte_indice) 
    } 


    func longPressGesture() 
    { 
     let lpg = UILongPressGestureRecognizer(target: self.Map, action: "longPressAction:") 
     lpg.minimumPressDuration = 1; 
     Map.addGestureRecognizer(lpg) 
    } 

    func longPressAction(myRecognizer : UILongPressGestureRecognizer) 
    { 
     let currPoint = myRecognizer.locationInView(Map) 
     let point = Map.convertPoint(currPoint, toCoordinateFromView: Map) 
     points.append(currPoint); 
     if(points.count>1) 
     { 
      let startPoint = Map.convertPoint(points[points.count-2], toCoordinateFromView: Map) 
      let endPoint = Map.convertPoint(currPoint, toCoordinateFromView: Map) 
      var lineCoords = [startPoint,endPoint] 
      var line = MKPolyline(coordinates: &lineCoords, count: 2) 
      var test = MKPolylineRenderer(polyline: line) 
      test.lineWidth = 10; 
      test.strokeColor = UIColor.redColor() 
      Map.addOverlay(line) 
     } 
     let myAnnotation = MKPointAnnotation(); 
     myAnnotation.coordinate = point 
     myAnnotation.title = "Test" 
     myAnnotation.subtitle = "Test subtitle" 
     Map.addAnnotation(myAnnotation); 
    } 


    func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer { 
     if overlay is MKCircle { 
      let circle = MKCircleRenderer(overlay: overlay); 
      circle.strokeColor = UIColor.redColor(); 
      circle.fillColor = UIColor(red: 255, green: 0, blue: 0, alpha: 0.1); 
      circle.lineWidth = 1; 
      return circle; 
     }else if overlay is MKTileOverlay { 
      var carte_Renderer = MKTileOverlayRenderer(overlay: overlay) 
      carte_Renderer.alpha = 0.9 
      return carte_Renderer 
     }else if overlay is MKPolyline { 
      let polylineRenderer = MKPolylineRenderer(overlay: overlay); 
      polylineRenderer.strokeColor = UIColor.blueColor(); 
      polylineRenderer.lineWidth = 5; 
      return polylineRenderer; 
     }else { 
      return MKPolylineRenderer(); 
     } 
    } 
} 

Viewcontroller Klassen wie folgt aussehen:

class BuildTrack: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate{ 

@IBOutlet var testRef: MKMapView! 

var mapController : MapController! 


required init?(coder aDecoder : NSCoder) 
{ 

    super.init(coder: aDecoder) 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    mapController = MapController(_Map: testRef, delClass: "BuildTrack") 

    mapController.longPressGesture(); 
      testRef.delegate = mapController 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 
} 

Ich denke, es ist, weil ich nicht berechtigt, einen Delegierten zu erklären. Ich habe versucht, dies in meinem MapController Klasse wie dies zu tun:

self.Map = _Map 
Map.delegate = BuildTrack.self() 

, bekam aber gleiche Ausnahme, wenn ich Karte angeklickt (jetzt habe ich auch nicht die Karte sehen, stürzt in die init von MapController), sieht aus wie Vor der Zeit wird etwas entsorgt.

Ist das Problem wirklich in Delegierten, und ist dieser Ansatz in Ordnung? Als ich einen ViewController hatte und die gesamte Logik darin war, funktionierte es gut, ein Problem trat auf, als ich versuchte, die Logik von der Schnittstelle zu trennen.

Antwort

1

Ich sehe Problem in Steckdose testRef bevor es Wert

Versuchen haben ! in mapController Erklärung

var mapController: MapController! 

und entfernen mapController Initialisierung von init hinzuzufügen:

required init?(coder aDecoder : NSCoder) { 
    super.init(coder: aDecoder) 
} 
+0

i bewegt Initialisierung viewDidLoad, nicht gibt es mir Fehler "Verwendung der lokalen Variablen mapController vor der Deklaration" – Jamil

+0

@Jamil entferne var Schlüsselwort, das mapController in viewDidLoad macht –

+0

neu zu swift, denke immer, dass der Compiler mich benachrichtigt, wenn ich versuche, Variable mit demselben Namen zu deklarieren ja, es hat funktioniert, aber jetzt bekomme ich denselben Fehler in AppDelegate wenn ich auf klicke Karte – Jamil