2015-10-18 8 views
2

Я пытаюсь изменить тип карты с помощью сегментированной кнопки управления, я хочу, чтобы он изменил тип карты с тремя параметрами: стандартным, спутниковым и гибридным. До сих пор у меня есть этот код, но ничего не происходит, когда другой тип карты выбран:Изменить тип карты (гибрид, спутник) через сегментированный элемент управления

@IBAction func segmentedControlAction(sender: UISegmentedControl!) { 

    if sender.selectedSegmentIndex == 0{ 

     mapView.mapType = MKMapType.Standard 
    } 
    else if sender.selectedSegmentIndex == 1{ 

     mapView.mapType = MKMapType.Satellite 
    } 
    else if sender.selectedSegmentIndex == 3{ 

     mapView.mapType = MKMapType.Hybrid 
    } 
} 

Я новичок в Swift и Xcode поэтому любая помощь приветствуется :)

Благодарности

+0

скорее всего .. MAPview равен нулю или метод не вызывается –

ответ

20

Во-первых, убедитесь, что ваш метод вызывается при изменении выбора сегментированного управления. Легко забыть подключить способы выхода. После того, как вы это подтвердите, помните, что данные карты загружаются асинхронно, поэтому вы можете не заметить, что это изменение сразу после выбора другого режима. Тем не менее, с кодом вы в курсе, вы будете никогда увидеть .Hybrid типа, потому что selectedSegmentIndex в элементе управления 3-сегмента будет никогда быть 3.

Более краткий способ реализации этого метода:

@IBAction func segmentedControlAction(sender: UISegmentedControl!) { 
    switch (sender.selectedSegmentIndex) { 
     case 0: 
      mapView.mapType = .Standard 
     case 1: 
      mapView.mapType = .Satellite 
     default: 
      mapView.mapType = .Hybrid 
    } 
} 

Обратите внимание, что Swift не нуждается в break инструкциях в конце каждого case.

1
import CoreLocation 
import MapKit 

class ViewController: UIViewController,CLLocationManagerDelegate,MKMapViewDelegate { 

    @IBOutlet weak var my_map: MKMapView! 

    var my_location = CLLocationManager() 

    enum maptype:NSInteger 
    { 
     case standardmap = 0 
     case satellitemap = 1 
     case hybridmap = 2 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view, typically from a nib. 
     self.my_map.showsUserLocation = true 
     self.my_map.delegate = self  
     self.my_location = CLLocationManager.init() 
     self.my_location.delegate = self 
     self.my_location.requestWhenInUseAuthorization() 
     self.my_location.stopUpdatingLocation()    

     let location = CLLocationCoordinate2DMake(11.004556, 76.961632) 
     let span = MKCoordinateSpanMake(0.1, 0.1) 
     let region = MKCoordinateRegionMake(location, span) 

     my_map.setRegion(region, animated: true) 

     let annotation = MKPointAnnotation() 

     annotation.coordinate = location 
     annotation.title = "coimbatore" 
     annotation.subtitle = "manchester city" 

     my_map.addAnnotation(annotation)  
    } 

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? 
    {  
     /*let annotationview = MKAnnotationView(annotation: annotation, reuseIdentifier: "pin") 

     annotationview.image = UIImage(named:"nature.jpeg") 

     //let transform = CGAffineTransform(scaleX: 0.1, y: 0.1) 
     //annotationview.transform = transform 

     return annotationview*/ 

     let annotationReuseId = "Place" 

     var anView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationReuseId) 

     if anView == nil { 
      anView = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationReuseId) 
     } else { 
      anView?.annotation = annotation 
     } 

     anView?.image = UIImage(named: "annotation") 

     let transform = CGAffineTransform(scaleX: 0.1, y: 0.1) 

     anView?.transform = transform 
     anView?.backgroundColor = UIColor.clear 
     anView?.canShowCallout = false 

     return anView 
    } 

    @IBAction func maptypes(_ sender: Any) 
    { 
     switch(sender as AnyObject).selectedSegmentIndex 
     { 
     case maptype.standardmap.rawValue: 
      my_map.mapType = .standard 
     case maptype.satellitemap.rawValue: 
      my_map.mapType = .satellite 
     case maptype.hybridmap.rawValue: 
      my_map.mapType = .hybrid 
     default: 
      break 
     } 
    } 
+1

Обычно это лучше объяснить решение, а не просто размещение некоторых строк анонимного кода. Вы можете прочитать [Как написать хороший ответ] (https://stackoverflow.com/help/how-to-answer), а также [Объяснение полностью основанных на кодах ответов] (https://meta.stackexchange.com/вопросы/114762/объяснения-entirely-% E2% 80% 8C% E2% 80% 8Bcode на основе-ответы) –