Ios 如何使段控制在Swift4中工作?
我创建了如下自定义视图:Ios 如何使段控制在Swift4中工作?,ios,swift,mapkit,Ios,Swift,Mapkit,我创建了如下自定义视图: import UIKit import MapKit class MapViewController: UIViewController { var mapView: MKMapView! func mapTypeChanged(segControl: UISegmentedControl){ switch segControl.selectedSegmentIndex { case 0: m
import UIKit
import MapKit
class MapViewController: UIViewController {
var mapView: MKMapView!
func mapTypeChanged(segControl: UISegmentedControl){
switch segControl.selectedSegmentIndex {
case 0:
mapView.mapType = .standard
case 1:
mapView.mapType = .hybrid
case 2:
mapView.mapType = .satellite
default:
break
}
}
override func loadView() {
mapView = MKMapView()
view = mapView
let segmentedControl = UISegmentedControl(items: ["Standard", "Hybrid", "Satellite"])
segmentedControl.backgroundColor = UIColor.white.withAlphaComponent(0.5)
segmentedControl.selectedSegmentIndex = 0
segmentedControl.addTarget(self, action: "mapTypeChanged", for: .valueChanged)
segmentedControl.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(segmentedControl)
let topConstraint = segmentedControl.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: 8)
let margins = view.layoutMarginsGuide
let leadingContraint = segmentedControl.leadingAnchor.constraint(equalTo: margins.leadingAnchor)
let trailingConstraint = segmentedControl.trailingAnchor.constraint(equalTo: margins.trailingAnchor)
topConstraint.isActive = true
leadingContraint.isActive = true
trailingConstraint.isActive = true
}
}
没有构建问题。但当我运行应用程序并点击分段控件上的任何按钮时,它会中止应用程序。无法找出问题所在。我使用的是Xcode 9 beta。我想是您设置选择器的方式导致了这个问题 换成
segmentedControl.addTarget(self, action: #selector(mapTypeChanged), for: .valueChanged)
并将@iAction添加到您的mapTypeChanged中
@IBAction func mapTypeChanged(segControl: UISegmentedControl) {
我想是您设置选择器的方式导致了这个问题 换成
segmentedControl.addTarget(self, action: #selector(mapTypeChanged), for: .valueChanged)
并将@iAction添加到您的mapTypeChanged中
@IBAction func mapTypeChanged(segControl: UISegmentedControl) {
真正的答案是其他两种方法的混合
segmentedControl.addTarget(self,action:#selector(mapTypeChanged:),for:.valueChanged)
真正的答案是其他两种方法的混合
segmentedControl.addTarget(self,action:#选择器(mapTypeChanged:),for:.valueChanged)
我想根本不调用loadView
,地图视图是nil
。可能您的意思是调用viewDidLoad
loadView并显示地图。当我尝试更改地图类型时,应用程序崩溃。您遇到了什么错误?未知选择器?线程1:SIGABRTT这不是错误消息。这是一条发生异常的一般消息。我猜根本不调用加载视图,地图视图是nil
。可能您的意思是调用viewDidLoad
loadView并显示地图。当我尝试更改地图类型时,应用程序崩溃。您遇到了什么错误?未知选择器?线程1:SIGABRTT这不是错误消息。这是一条发生异常的一般信息。这是因为要在运行时绑定它,您需要Obj C运行时。在Swift 4中,这是一个更改,它永远不会隐式地接受Obj C运行时,所有使用Obj C运行时的内容都需要明确提及。因此,程序员和读者都知道,这将在运行时绑定到某个事件。苹果的文档在这里很混乱:与其使用\@objc,不如尝试使用\@IBAction,这也应该有效。我不是在我的机器上尝试的。这是因为@iActions也使用Obj C运行时。伟大的学问。谢谢,是的。这是因为要在运行时绑定它,您需要Obj C运行时。在Swift 4中,这是一个更改,它永远不会隐式地接受Obj C运行时,所有使用Obj C运行时的内容都需要明确提及。因此,程序员和读者都知道,这将在运行时绑定到某个事件。苹果的文档在这里很混乱:与其使用\@objc,不如尝试使用\@IBAction,这也应该有效。我不是在我的机器上尝试的。这是因为@iActions也使用Obj C运行时。伟大的学问。谢谢