2016-07-28 49 views
1

我试图在iOS应用程序中为不同的选项卡实现相同的逻辑,但获取线程1:EXC_BAD_INSTRUCTION(code = 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(); 
     } 
    } 
} 

视图控制器类是这样的:

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

,但得到了同样的异常,当我点击地图(现在我甚至不看地图,它崩溃的MapController的初始化),看起来像有些东西会在时间之前处理

问题真的出现在代表中,这种方法可行吗?当我有一个ViewController和所有的逻辑在里面,它工作正常,当我试图从接口分离逻辑时发生问题。

回答

1

我在使用出口testRef看问题才具有价值

尝试在mapController声明

var mapController: MapController! 

添加!和由init删除mapController初始化:

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

我搬到初始化viewDidLoad,不是它给我错误“在声明之前使用局部变量mapController” – Jamil

+0

@Jamil删除var关键字制作mapController在viewDidLoad –

+0

新来swift,总是认为编译器消息我,如果我尝试声明变量具有相同的名称 是的,它的工作,但现在我得到同样的错误在AppDelegate时,我点击地图 – Jamil