Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
267 views
in Technique[技术] by (71.8m points)

ios - Update mapview data in separate view controller

Note: you don't have to be familiar with Google Maps SDK or Places SDK to answer this question. Hi I am using a GMSMapView on my main MapViewController and GMSPlacesClient from Places SDK on a child view controller to search and return a list of places. Like this:

Map Search

What I want to do is to send send the mapView's camera target coordinates (the center of the map on the screen) to the child view controller. Basically I just want to pass data to the next view controller.

So far, I have this:

In my child view controller:

let mapViewController = MapViewController()

 func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
         searching = true
       
        
        let target = mapViewController.mapView.camera.target
        
        let northeast = CLLocationCoordinate2D(latitude: target.latitude + 0.1, longitude: target.longitude + 0.1)
      let southwest = CLLocationCoordinate2D(latitude: target.latitude - 0.1, longitude: target.longitude - 0.1)
       
        
      filter.locationBias = GMSPlaceRectangularLocationOption(northeast, southwest)
        
        GMSPlacesClient.shared().findAutocompletePredictions(fromQuery: searchText, filter: filter, sessionToken: nil, callback: { (result, error) in
            if error == nil && result != nil {
                self.matchingItems = result!
               
            }
        })
        mapSearchTableView.reloadData()
       
        
}

and in MapViewController

 @IBOutlet weak var mapViewView: UIView!
    var mapView = GMSMapView()

 override func viewDidLoad() {
        super.viewDidLoad()
       
        locationManager.delegate = self
        
        if CLLocationManager.locationServicesEnabled() {
            
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.startUpdatingLocation()
        }
        else {
            locationManager.requestWhenInUseAuthorization()
        }
        
        
        let camera = GMSCameraPosition.camera(withLatitude: 39.8097343, longitude: -98.5556199, zoom: 3.0)
        mapView = GMSMapView.map(withFrame: self.view.frame, camera: camera)
        mapViewView.addSubview(mapView)
        
        
        mapView.delegate = self
        mapView.isMyLocationEnabled = true

}

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
     
        let location = locations.last

        let camera = GMSCameraPosition.camera(withLatitude: (location?.coordinate.latitude)!, longitude: (location?.coordinate.longitude)!, zoom: 13.0)

        self.mapView.animate(to: camera)
        
        self.locationManager.stopUpdatingLocation()
        
    }

This doesn't seem to work, as when I print the mapViewController.mapView.camera.target (or the mapView's center coordinates from the MapViewController), in the child view controller it shows up with coordinates of (0,0). I have also tried many other ways, including setting target within the MapViewController itself, and then calling that target from the child view controller, but the child view controller only reads the initialized coordinate for target, and not the updated coordinate like I want it to.

So basically, what I'm asking is if there is a way to continually update the mapView's camera position coordinates (target) in the child view controller. Please let me know if you know!

question from:https://stackoverflow.com/questions/65879080/update-mapview-data-in-separate-view-controller

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I solved it! All it took was adding a struct within the original controller- the MapViewController containing the target variable, like this:

 struct setTarget {
        static var target = CLLocationCoordinate2D()
    }

func mapView(_ mapView: GMSMapView, didChange position: GMSCameraPosition) {
        setTarget.target = mapView.camera.target
    }

I set the target to the mapView.camera.target every time it updated a location, and then from my child view controller, I called MapViewController.setTarget.target every time that I needed it.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...