2016-07-28 4 views
1

Я пытаюсь реализовать ту же логику для разных вкладок в приложении iOS, но получаю Thread 1: EXC_BAD_INSTRUCTION (код = EXC_1386_INVOP, подкод 0x0). Это простое приложение, которое должно позволить пользователю отмечать некоторые точки на карте (прямо сейчас с аннотациями) и рисовать линии между ними в процессе.Swift EXC_BAD_INSTRUCTION при попытке использовать делегат

Класс, который содержит логику:

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 классы выглядеть следующим образом:

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() 
} 
} 

Я думаю, это потому, что я не объявить делегат право. Я пытался сделать это в моем классе MapController так:

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

, но получил то же самое исключение, когда я нажал карту (теперь я даже не увидеть карту, он выходит из строя в INIT из MapController), выглядит как что-то устраивает до времени.

Является ли проблема действительно делегатами, и такой подход в порядке? Когда у меня был один ViewController, и вся логика находилась внутри него, он работал нормально, возникла проблема, когда я попытался отделить логику от интерфейса.

ответ

1

Я вижу проблему в использовании выхода testRef прежде, чем это имеет значение,

Попробуйте добавить ! в mapController декларации

var mapController: MapController! 

и удалить mapController инициализации из INIT:

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

я переехал инициализацию viewDidLoad, не дает мне ошибку «Использование локальной переменной mapController перед ее объявлением» – Jamil

+0

@Jamil remove var keyword making mapController in viewDidLoad –

+0

новое для быстрого, всегда думаю, что компилятор сообщает мне, если я пытаюсь объявить переменную с тем же именем да, это сработало, но теперь я получаю такую ​​же ошибку в AppDelegate, когда я нажимаю на карта – Jamil

Смежные вопросы