0

我正在我的第一个视图控制器上查看一个位置。我还想在第二个视图控制器上查看相同的位置。如何将第一个视图控制器上的位置传递给第二个视图控制器?或试图将注释从一个视图控制器传递到另一个?

import UIKit
import Foundation
import MapKit
import CoreLocation

class FirstViewController: UIViewController, CLLocationManagerDelegate, UISearchBarDelegate, MKMapViewDelegate {

    //Map
    @IBOutlet weak var Map: MKMapView!


    let manager = CLLocationManager()
    var directionsArray: [MKDirections] = []


    //user location constanatly updates
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){

        let location = locations[0]

        let span:MKCoordinateSpan = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)
        //my location coordinates????
        let myLocation: CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude,location.coordinate.longitude)

        let region:MKCoordinateRegion = MKCoordinateRegion(center: myLocation, span: span)
        Map.showsScale = true
        Map.showsPointsOfInterest = true
        Map.setRegion(region, animated: true)
        self.Map.showsUserLocation = true
    }


    // Search Button functions
    @IBAction func SearchButton(_ sender: Any)
    {
        let searchController = UISearchController(searchResultsController: nil)
        searchController.searchBar.delegate = self
        present(searchController, animated: true, completion: nil)
    }

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        //Ignoring user
        UIApplication.shared.beginIgnoringInteractionEvents()

        //Activity Indicator
        let activityIndicator = UIActivityIndicatorView()
        activityIndicator.style = UIActivityIndicatorView.Style.gray
        activityIndicator.center = self.view.center
        activityIndicator.hidesWhenStopped = true
        activityIndicator.startAnimating()
        self.view.addSubview(activityIndicator)

        //hide search bar
        searchBar.resignFirstResponder()
        dismiss(animated: true, completion: nil)

        //Create the search request
        let searchRequest = MKLocalSearch.Request()
        searchRequest.naturalLanguageQuery = searchBar.text

        let activeSearch = MKLocalSearch(request: searchRequest)

        activeSearch.start{ (response, error) in

            activityIndicator.stopAnimating()
            UIApplication.shared.endIgnoringInteractionEvents()

            if response == nil
            {
                print("Error")
            }
            else
            {
                //Remove annotations
                let annotations = self.Map.annotations
                self.Map.removeAnnotations(annotations)

                //Getting Data
                let latitude = response?.boundingRegion.center.latitude
                let longitude = response?.boundingRegion.center.longitude

                //Create annotation
                let annotation = MKPointAnnotation()
                annotation.title = searchBar.text
                //annotation.coordinate = locationManager.location!.coordinate
                annotation.coordinate = CLLocationCoordinate2DMake(latitude!, longitude!)
                self.Map.addAnnotation(annotation)

                //Zooming in annotation
                let coordinate:CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude!, longitude!)
                let span = MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
                let region = MKCoordinateRegion(center: coordinate,span: span)
                self.Map.setRegion(region, animated: true)

                let sourceCoordinates = self.manager.location?.coordinate
                let destinationCoodinates = CLLocationCoordinate2DMake(latitude!, longitude!)

                let sourcePlacemark = MKPlacemark(coordinate: sourceCoordinates!)
                let destPlacemark = MKPlacemark(coordinate: destinationCoodinates)

                let sourceItem = MKMapItem(placemark: sourcePlacemark)
                let destItem = MKMapItem(placemark: destPlacemark)

                let directionsRequest = MKDirections.Request()
                directionsRequest.source = sourceItem
                directionsRequest.destination = destItem
                directionsRequest.transportType = .automobile

                let directions = MKDirections(request: directionsRequest)
                directions.calculate(completionHandler: { response, error in

                guard let response = response else {
                    if let error = error  {
                        print("Something Went Wrong")
                    }
                    return
                }
                // reset/clear prevous search route
                resetMapView(withNew: directions)
                // display single best route on map with a polyline
                let route = response.routes[0]
                self.Map.addOverlay(route.polyline, level: .aboveRoads)

                // animate/draw route on map
                let rekt = route.polyline.boundingMapRect
                self.Map.setRegion(MKCoordinateRegion(rekt),animated: true)
                })

                //function removes current route on map
                func resetMapView(withNew directions: MKDirections){
                    self.Map.removeOverlays(self.Map.overlays)
                    self.directionsArray.append(directions)
                    let _ = self.directionsArray.map { $0.cancel() }
                }
            }
        }
    }
    //******************************************************************************************

    override func viewDidLoad() {

        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.requestWhenInUseAuthorization()
        manager.startUpdatingLocation()
    }

    // function displays route on map
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        let renderer = MKPolylineRenderer(overlay: overlay)
        renderer.strokeColor = UIColor.blue
        renderer.lineWidth = 5.0
        return renderer;
    }
}

// 下面的第二个视图控制器代码

import UIKit
import Foundation
import MapKit
import CoreLocation


class SecondViewController: UIViewController, CLLocationManagerDelegate, UISearchBarDelegate, MKMapViewDelegate {


@IBOutlet weak var Map2: MKMapView!

let manager = CLLocationManager()
var directionsArray: [MKDirections] = []


//************************************************************

//user location constanatly updates
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{

    let location = locations[0]

    let span:MKCoordinateSpan = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)
    // my location coordinates
    let myLocation: CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude,location.coordinate.longitude)

    let region:MKCoordinateRegion = MKCoordinateRegion(center: myLocation, span: span)
    Map2.showsScale = true
    Map2.showsPointsOfInterest = true
    Map2.setRegion(region, animated: true)
    self.Map2.showsUserLocation = true

}



override func viewDidLoad()
{

    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    manager.delegate = self
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.requestWhenInUseAuthorization()
    manager.startUpdatingLocation()
}
// function displays route on map
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    let renderer = MKPolylineRenderer(overlay: overlay)
    renderer.strokeColor = UIColor.blue
    renderer.lineWidth = 5.0
    return renderer;


}        
}
4

0 回答 0