尝试使用委托时的Swift EXC_BAD_指令
我试图为iOS应用程序中的不同选项卡实现相同的逻辑,但得到线程1:EXC_BAD_指令(代码=EXC_1386_INVOP,子代码0x0)。这是一个简单的应用程序,应该允许用户在地图上标记一些点(现在有注释),并在过程中在它们之间画线 包含逻辑的类:尝试使用委托时的Swift EXC_BAD_指令,swift,delegates,mapkit,Swift,Delegates,Mapkit,我试图为iOS应用程序中的不同选项卡实现相同的逻辑,但得到线程1:EXC_BAD_指令(代码=EXC_1386_INVOP,子代码0x0)。这是一个简单的应用程序,应该允许用户在地图上标记一些点(现在有注释),并在过程中在它们之间画线 包含逻辑的类: class MapController : NSObject, MKMapViewDelegate{ var Map: MKMapView! var points : [CGPoint] init(_Map : MKM
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/test@GoogleMapsCompatible/{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()
}
}
self.Map = _Map
Map.delegate = BuildTrack.self()
我想这是因为我没有声明代表是正确的。我在MapController类中尝试这样做:
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()
}
}
self.Map = _Map
Map.delegate = BuildTrack.self()
,但当我单击map时出现了相同的异常(现在我甚至看不到该映射,它在MapController的init中崩溃),看起来有些东西在时间之前就被处理掉了
问题是否真的存在于学员中?这种方法是否可行?当我有一个ViewController并且所有的逻辑都在里面时,它工作得很好,当我试图将逻辑从接口中分离出来时出现了问题。我发现在它有值之前使用outlet
testRef
有问题
尝试添加代码>在mapController
声明中
var mapController: MapController!
并从初始化中删除mapController
初始化:
required init?(coder aDecoder : NSCoder) {
super.init(coder: aDecoder)
}
我将初始化移动到viewDidLoad,而不是它给我的错误是“在声明之前使用局部变量mapController”@Jamil remove var关键字使viewDidLoad中的mapController成为swift的新成员,始终认为编译器会给我发信息如果我尝试声明同名变量是的,它起作用了,但现在,当我单击mapOk时,AppDelegate中出现了相同的错误。只需停止使用MapController类:删除它并将所有代码移动到BuildTrack。因为BuildTrack是MapView的委托,但似乎您认为MapController是委托,而不是。我想传递当前选项卡的MapView的MapController委托并调用MapController的方法,这可能吗?