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.
i bewegt Initialisierung viewDidLoad, nicht gibt es mir Fehler "Verwendung der lokalen Variablen mapController vor der Deklaration" – Jamil
@Jamil entferne var Schlüsselwort, das mapController in viewDidLoad macht –
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