2017-08-04 13 views
0

私はこのようなカスタムビューを作成しました:Swift4でセグメント制御を行うには?

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ベータ版を使用しています。

+0

は 'loadView'はまったく呼び出されず、マップビューは' nil'です。おそらく 'viewDidLoad'を意味するかもしれません。 – vadian

+0

loadViewが呼び出され、mapが表示されます。地図のタイプを変更しようとするとアプリがクラッシュする – KawaiKx

+0

どのようなエラーが表示されますか?不明なセレクタ? – vadian

答えて

2

私はあなたがセレクタを設定する方法は本当の答えはとのハイブリッドである問題が

segmentedControl.addTarget(self, action: #selector(mapTypeChanged), for: .valueChanged) 

に変更し、

@IBAction func mapTypeChanged(segControl: UISegmentedControl) { 
+0

これが機能しました。私はfunc – KawaiKx

+1

ええの前に@objcを追加しなければならなかった。それは実行時にバインドするため、Obj C runtimeが必要になります。Swift 4では、Obj Cランタイムを暗黙的に使用しないように変更されました。Obj Cランタイムを使用するものはすべて明示的に言及する必要があります。プログラマと読者は、これが実行時に何らかのイベントに拘束されることを知るようにします。 –

+0

Appleのドキュメントはここでは混乱しています:https://developer.apple.com/documentation/uikit/uicontrol/1618259-addtarget \\ objcの代わりに – KawaiKx

0

のようなあなたのmapTypeChangedに@IBActionを追加 引き起こしていると思います他の2つ。私は推測

segmentedControl.addTarget(self, action: #selector(mapTypeChanged:), for: .valueChanged)

+0

が機能しませんでした。より多くの赤い警告 – KawaiKx

関連する問題