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运行时。伟大的学问。谢谢