Как добавить GMSMapView в раскадровку в IOS

https://developers.google.com/maps/documentation/ios-sdk/utility/marker-clustering

Я работаю над кластеризацией карт. В кластеризации карт

private var mapView: GMSMapView!

используется для mapView, но не может найти ни одного GMSMapView! в раскадровке связи.

Из раскадровки я нашел

 @IBOutlet var mapView: MKMapView!

это создает проблему. когда я использовал exampled карту Google, она выдает ошибку

этот класс не соответствует кодированию ключевого значения для ключевого mapView.

Вот полный код:

import UIKit
import MapKit
import GooglePlaces
import GoogleMaps



// Point of Interest Item which implements the GMUClusterItem protocol.
class POIItem: NSObject, GMUClusterItem {
    var position: CLLocationCoordinate2D
    var name: String!

    init(position: CLLocationCoordinate2D, name: String) {
        self.position = position
        self.name = name
    }
}

let kClusterItemCount = 10000
let kCameraLatitude = -33.8
let kCameraLongitude = 151.2

class FirstViewController: UIViewController , GMUClusterManagerDelegate,
GMSMapViewDelegate {



   // @IBOutlet var mapView: MKMapView!


    private var mapView: GMSMapView!



     private var clusterManager: GMUClusterManager!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set up the cluster manager with the supplied icon generator and
        // renderer.


        // Set up the cluster manager with default icon generator and renderer.
        let iconGenerator = GMUDefaultClusterIconGenerator()
        let algorithm = GMUNonHierarchicalDistanceBasedAlgorithm()
        let renderer = GMUDefaultClusterRenderer(mapView: mapView, clusterIconGenerator: iconGenerator)
        clusterManager = GMUClusterManager(map: mapView, algorithm: algorithm, renderer: renderer)

        // Generate and add random items to the cluster manager.
        generateClusterItems()

        // Call cluster() after items have been added to perform the clustering and rendering on map.
        clusterManager.cluster()

        // Register self to listen to both GMUClusterManagerDelegate and GMSMapViewDelegate events.
        clusterManager.setDelegate(self, mapDelegate: self)


    }

//    override func loadView() {
//        
//        // Create a GMSCameraPosition that tells the map to display the
//        // coordinate -33.86,151.20 at zoom level 6.
//        let camera = GMSCameraPosition.camera(withLatitude: -33.86, longitude: 151.20, zoom: 6.0)
//        let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
//        view = mapView
//        
//        // Creates a marker in the center of the map.
//        let marker = GMSMarker()
//        marker.position = CLLocationCoordinate2D(latitude: -33.86, longitude: 151.20)
//        marker.title = "Sydney"
//        marker.snippet = "Australia"
//        marker.map = mapView
//        
//    }
//    

    // MARK: - GMUClusterManagerDelegate
    func clusterManager(clusterManager: GMUClusterManager, didTapCluster cluster: GMUCluster) {
        let newCamera = GMSCameraPosition.camera(withTarget: cluster.position,
                                                           zoom: mapView.camera.zoom + 1)
        let update = GMSCameraUpdate.setCamera(newCamera)
        mapView.moveCamera(update)
    }

    // MARK: - GMUMapViewDelegate
    func mapView(mapView: GMSMapView, didTapMarker marker: GMSMarker) -> Bool {
        if let poiItem = marker.userData as? POIItem {
            NSLog("Did tap marker for cluster item \(poiItem.name)")
        } else {
            NSLog("Did tap a normal marker")
        }
        return false
    }

    // MARK: - Private
    /// Randomly generates cluster items within some extent of the camera and adds them to the
    /// cluster manager.
    private func generateClusterItems() {
        let extent = 0.2
        for index in 1...kClusterItemCount {
            let lat = kCameraLatitude + extent * randomScale()
            let lng = kCameraLongitude + extent * randomScale()
            let name = "Item \(index)"
            let item = POIItem(position: CLLocationCoordinate2DMake(lat, lng), name: name)
            clusterManager.add(item)
        }
    }

    /// Returns a random value between -1.0 and 1.0.
    private func randomScale() -> Double {
        return Double(arc4random()) / Double(UINT32_MAX) * 2.0 - 1.0
    }
}

person arif hasnat    schedule 20.03.2017    source источник
comment
Просто добавьте представление и установите для него класс GMSMapView вместо MKMapView.   -  person chengsam    schedule 20.03.2017


Ответы (2)


Первый взгляд на UIView:

Take UIView

Добавьте UIView в UIViewController:

Добавить представление

Назначить класс GMSMap View

Назначить курс

А теперь создайте выход GMSMapView.

@IBOutlet var mapView: GMSMapView!
person Sakir Sherasiya    schedule 30.03.2017
comment
Отметьте мой ответ как правильный ответ, потому что кто-то другой легко найдет ответ. - person Sakir Sherasiya; 08.04.2017
comment
также не забудьте добавить импорт GoogleMaps в свой контроллер просмотра - person Jonathan Vukadinovic; 15.08.2017

Чтобы добавить GMSMapView в Storyboard в IOS, откройте Identity Inspector и в разделе Custom Class добавьте GMSMapView. Вы можете следовать этому руководству о SDK Google Maps для iOS в Xcode Storyboard для получения пошаговых инструкций. Для вашей ошибки < strong> этот класс не соответствует кодировке ключевого значения для ключевого mapView, возможно, вы создали выход под названием mapview и удалили его позже. Проверьте, не работают ли выходы MapView в Xib / Storyboard. Вот также некоторые ссылки, которые могут помочь: https://www.raywenderlich.com/109888/google-maps-ios-sdk-tutorial и Что это значит? 'NSUnknownKeyException', причина: ... этот класс не соответствует кодированию значения ключа для ключа X

person abielita    schedule 22.03.2017