代码之家  ›  专栏  ›  技术社区  ›  SWOON

图像注释不同

  •  0
  • SWOON  · 技术社区  · 8 年前

    我创建了一个带有不同注释和搜索的地图视图。我不能根据pin赋予不同的图像。我还有另一个担心,当我进行搜索时,它会删除一个pin,将其放在搜索的新位置。下面是一位年轻程序员的代码。提前感谢您的帮助。

    import MapKit
    import UIKit
    import CoreLocation
    
    class MapViewController: UIViewController, UISearchBarDelegate, MKMapViewDelegate {
    
        @IBOutlet weak var MapView: MKMapView!
    
        var searchController:UISearchController!
        var annotation:MKAnnotation!
        var localSearchRequest:MKLocalSearchRequest!
        var localSearch:MKLocalSearch!
        var localSearchResponse:MKLocalSearchResponse!
        var error:NSError!
        var pointAnnotation:MKPointAnnotation!
        var pinAnnotationView:MKPinAnnotationView!
    
        var coordinates: [[Double]]!
        var name:[String]!
    
        let regionRadius: CLLocationDistance = 1000
    
        @IBAction func showSearchBar(_ sender: Any) {
    
            searchController = UISearchController(searchResultsController: nil)
            searchController.hidesNavigationBarDuringPresentation = false
            self.searchController.searchBar.delegate = self
            present(searchController, animated: true, completion: nil)
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
    
            self.MapView.delegate = self
    
            var Tirta = CustomPointAnnotation()
            Tirta.coordinate = CLLocationCoordinate2DMake(-8.415162, 115.315360)
            Tirta.title = "Tirta Empul"
            Tirta.imageName = "PaConseil.png"
    
            var Goa = CustomPointAnnotation()
            Goa.coordinate = CLLocationCoordinate2DMake(-8.551313, 115.468865)
            Goa.title = "Goa Lawah"
            Goa.imageName = "PaMecontent.png"
    
            MapView.addAnnotation(Tirta)
            MapView.addAnnotation(Goa)
    
            // 3
            let region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: -8.670458199999999, longitude: 115.2126293), span: MKCoordinateSpan(latitudeDelta: 2, longitudeDelta: 2))
            self.MapView.setRegion(region, animated: true)
        }
    
        func MapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
    
            print("delegate called")
    
            if !(annotation is CustomPointAnnotation) {
                return nil
            }
    
            let reuseId = "test"
    
            var AnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId)
            if AnnotationView == nil {
                AnnotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
                AnnotationView?.canShowCallout = true
            }
            else {
                AnnotationView?.annotation = annotation
            }
    
            func didReceiveMemoryWarning() {
                super.didReceiveMemoryWarning()
    
            }
    
            let CustomPointAnnotation = annotation as! CustomPointAnnotation
            AnnotationView?.image = UIImage(named:CustomPointAnnotation.imageName)
    
            return AnnotationView
        }
    
        class CustomPointAnnotation: MKPointAnnotation {
            var imageName: String!
        }
    
        func searchBarSearchButtonClicked(_ searchBar: UISearchBar){
            //1
            searchBar.resignFirstResponder()
            dismiss(animated: true, completion: nil)
            if self.MapView.annotations.count != 0{
                annotation = self.MapView.annotations[0]
                self.MapView.removeAnnotation(annotation)
            }
            //2
            localSearchRequest = MKLocalSearchRequest()
            localSearchRequest.naturalLanguageQuery = searchBar.text
            localSearch = MKLocalSearch(request: localSearchRequest)
            localSearch.start { (localSearchResponse, error) -> Void in
    
                if localSearchResponse == nil{
                    let alertController = UIAlertController(title: nil, message: "Place Not Found", preferredStyle: UIAlertControllerStyle.alert)
                    alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.default, handler: nil))
                    self.present(alertController, animated: true, completion: nil)
                    return
                }
                //3
                self.pointAnnotation = MKPointAnnotation()
                self.pointAnnotation.title = searchBar.text
                self.pointAnnotation.coordinate = CLLocationCoordinate2D(latitude: localSearchResponse!.boundingRegion.center.latitude, longitude:     localSearchResponse!.boundingRegion.center.longitude)
    
    
                self.pinAnnotationView = MKPinAnnotationView(annotation: self.pointAnnotation, reuseIdentifier: nil)
                self.MapView.centerCoordinate = self.pointAnnotation.coordinate
                self.MapView.addAnnotation(self.pinAnnotationView.annotation!)
            }
    
        }
    }
    
    
    import Foundation
    import MapKit
    
    class CustomPointAnnotation: MKPointAnnotation {
    
        var coordinates: CLLocationCoordinate2D
        var name: String!
        var imageName: UIImage!
    
        init(coordinates: CLLocationCoordinate2D) {
            self.coordinates = coordinates
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   matt    8 年前

    我将假设您已经更新了Xcode,因此现在使用的是Swift 3。那么,问题是这个方法永远不会被执行:

    func MapView(mapView: MKMapView!, 
        viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
    

    …原因是这不是它正确的“签名”。该方法现在已定义 like this :

    func mapView(_ mapView: MKMapView, 
        viewFor annotation: MKAnnotation) -> MKAnnotationView?