图像注释不同

时间:2016-11-21 18:39:18

标签: xcode mapkitannotation

我创建了一个具有不同注释和搜索的地图视图。我不能根据引脚归因于不同的图像。我还有另外一个问题,当我进行搜索时,它会移除一个引脚以将其放在新寻找的地方。以下是年轻编码员的代码。提前谢谢你的帮助。

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 个答案:

答案 0 :(得分:0)

我将假设你已经更新了Xcode,以便你现在正在使用Swift 3.那么,问题是这个方法永远不会被执行:

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

......原因是这不正确"签名"。该方法现在定义为like this

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