2015-07-20 217 views
1

我有一個名爲「direction」的標籤。我有一個很多針腳的地圖。當我點擊一個引腳,點擊標籤「方向」,它給了我兩個選項,並正常工作。但是當我不點擊一個Pin並點擊de標籤「方向」時,應用程序崩潰。在Swift中添加語句功能

我想設置一個語句,當一個引腳沒有被選中時,一個警報顯示用戶首先選擇一個引腳來獲取方向。

希望有人可以看看代碼來實現這一目標:

import UIKit 
import MapKit 


class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate, GMSMapViewDelegate { 




    @IBOutlet weak var mapView: GMSMapView! 




    @IBAction func MapType(sender: AnyObject) { 
     let segmentedControl = sender as! UISegmentedControl 
     switch segmentedControl.selectedSegmentIndex { 
     case 0: 
      mapView.mapType = kGMSTypeNormal 
     case 1: 
      mapView.mapType = kGMSTypeSatellite 
     case 2: 
      mapView.mapType = kGMSTypeHybrid 
     default: 
      mapView.mapType = mapView.mapType 
     } 
    } 


    let locationManager = CLLocationManager() 

    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 

     //3 
     mapView.delegate = self 
     locationManager.delegate = self 
     locationManager.requestWhenInUseAuthorization() 

     var Marker= GMSMarker() 
     Marker.position = CLLocationCoordinate2DMake(5.2317, 4.5708) 
     Marker.title = "1" 
     Marker.snippet = "1" 
     Marker.appearAnimation = kGMSMarkerAnimationPop 
     Marker.map = mapView 

     var Marker1= GMSMarker() 
     Marker1.position = CLLocationCoordinate2DMake(5.2317, 8.5708) 
     Marker1.title = "2" 
     Marker1.snippet = "2" 
     Marker1.map = mapView  



     let label = UILabel(frame: CGRectMake(view.frame.size.width - 100, view.frame.size.height - 40, 80, 30)) 
     label.backgroundColor = UIColor.whiteColor() 
     label.text = "direction" 
     label.textAlignment = .Center 
     label.layer.cornerRadius = 10 
     label.clipsToBounds = true 
     label.userInteractionEnabled = true 

     let tap = UITapGestureRecognizer(target: self, action: "directionTapped") 
     label.addGestureRecognizer(tap) 




     mapView!.settings.consumesGesturesInView = false 
     mapView!.addSubview(label) 
     mapView!.bringSubviewToFront(label) 

     self.view.addSubview(label) 

    } 

    func directionTapped() { 
     let openMapsActionSheet = UIAlertController(title: "Open in Maps", message: "Choose a maps application", preferredStyle: .ActionSheet) 
     openMapsActionSheet.addAction(UIAlertAction(title: "Apple Maps", style: .Default, handler: { (action: UIAlertAction!) -> Void in 
      let placemark = MKPlacemark(coordinate: CLLocationCoordinate2DMake(self.mapView!.selectedMarker.position.latitude, self.mapView!.selectedMarker.position.longitude), addressDictionary: nil) 
      let item = MKMapItem(placemark: placemark) 
      let options = [MKLaunchOptionsDirectionsModeKey: 
       MKLaunchOptionsDirectionsModeDriving, 
       MKLaunchOptionsShowsTrafficKey: true] 
      item.openInMapsWithLaunchOptions(options as [NSObject : AnyObject]) 
     })) 
     openMapsActionSheet.addAction(UIAlertAction(title: "Google Maps", style: .Default, handler: { (action: UIAlertAction!) -> Void in 
      if (UIApplication.sharedApplication().canOpenURL(NSURL(string:"comgooglemaps://")!)) { 
       UIApplication.sharedApplication().openURL(NSURL(string: 
        "comgooglemaps://?daddr=\(self.mapView!.selectedMarker.position.latitude),\(self.mapView!.selectedMarker.position.longitude)")!) 
      } else { 
       UIApplication.sharedApplication().openURL(NSURL(string: 
        "http://maps.google.com/maps?daddr=\(self.mapView!.selectedMarker.position.latitude),\(self.mapView!.selectedMarker.position.longitude)")!) 
      } 
     })) 
     openMapsActionSheet.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)) 
     presentViewController(openMapsActionSheet, animated: true, completion: nil) 
    } 




    // 1 
    func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
     // 2 
     if status == .AuthorizedWhenInUse { 

      // 3 
      locationManager.startUpdatingLocation() 

      //4 
      mapView.myLocationEnabled = true 
      mapView.settings.myLocationButton = true 
     } 
    } 

    // 5 
    func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { 
     if let location = locations.first as? CLLocation { 

      // 6 
      mapView.camera = GMSCameraPosition(target: location.coordinate, zoom: 6, bearing: 1, viewingAngle: 1) 

      // 7 
      locationManager.stopUpdatingLocation() 
     } 
    } 





} 
+1

嘗試水龍頭一行: let tap = UITapGestureRecognizer(target:self,action:「directionTapped:」) and the action like this: func directionTapped(sender:AnyObject?) –

回答

0

在沒有完整的代碼,這裏是我可以推斷:

  1. 我假設你有一個MapView這已經設定好了。

  2. 我假設的MapView只有當用戶選擇引腳.selectedMarker被填充,否則它是零(或其他一些值u選擇),那麼,

現在,directionTapped應該是:

if self.mapView!.selectedMarker != nil { 
    <Your current Code> 
} else { 
    <Code to Show the new alert about pin not selected> 
} 
+1

我已經編輯了我的queston,並在ViewController.swift中完成了代碼 –

1

與此代碼它從我的工作:

func directionTapped(){ 
    //code input from Apple-and-Oranges 
      if self.mapView!.selectedMarker != nil { 
    //current code 
      let openMapsActionSheet = UIAlertController(title: "Open in Maps", message: "Choose a maps application", preferredStyle: .ActionSheet) 
       openMapsActionSheet.addAction(UIAlertAction(title: "Apple Maps", style: .Default, handler: { (action: UIAlertAction!) -> Void in 
        let placemark = MKPlacemark(coordinate: CLLocationCoordinate2DMake(self.mapView!.selectedMarker.position.latitude, self.mapView!.selectedMarker.position.longitude), addressDictionary: nil) 
        let item = MKMapItem(placemark: placemark) 
        let options = [MKLaunchOptionsDirectionsModeKey: 
         MKLaunchOptionsDirectionsModeDriving, 
         MKLaunchOptionsShowsTrafficKey: true] 
        item.openInMapsWithLaunchOptions(options as [NSObject : AnyObject]) 
       })) 
       openMapsActionSheet.addAction(UIAlertAction(title: "Google Maps", style: .Default, handler: { (action: UIAlertAction!) -> Void in 
        if (UIApplication.sharedApplication().canOpenURL(NSURL(string:"comgooglemaps://")!)) { 
         UIApplication.sharedApplication().openURL(NSURL(string: 
         "comgooglemaps://?daddr=\(self.mapView!.selectedMarker.position.latitude),\(self.mapView!.selectedMarker.position.longitude)")!) 
        } else { 
         UIApplication.sharedApplication().openURL(NSURL(string: 
         "http://maps.google.com/maps?daddr=\(self.mapView!.selectedMarker.position.latitude),\(self.mapView!.selectedMarker.position.longitude)")!) 
        } 
       })) 
       openMapsActionSheet.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)) 
       presentViewController(openMapsActionSheet, animated: true, completion: nil) 
      } 
    //Added a alert message 
      else { 


       let alertController = UIAlertController(title: "Choose Pin!", message: "\nChoose Pin to get navigation from current location", preferredStyle: .Alert) 


       alertController.addAction(UIAlertAction(title: "Cancel", style: .Default, handler: { (action: UIAlertAction!) in 
       })) 

       presentViewController(alertController, animated: true, completion: nil) 
      } 
      }