Ios 如何将CLLocation传递给不同的ViewController

Ios 如何将CLLocation传递给不同的ViewController,ios,swift,mapkit,segue,cllocation,Ios,Swift,Mapkit,Segue,Cllocation,我的应用程序有两个标签。在第一个选项卡上,将基于吸引力创建一组选项卡注释。单击注释视图时,它将转到第二个选项卡,该选项卡是景点的详图视图控制器。我想知道我怎样才能把景点的位置传给detailVC,这样我就可以在同一个地址拥有pin。这是我到目前为止所掌握的信息,其中存在一些不一致之处,因为细节vc上显示的地址与景点地址不相等 func performSearch(input:String) { attractionsMap.removeAnnotations(attractio

我的应用程序有两个标签。在第一个选项卡上,将基于吸引力创建一组选项卡注释。单击注释视图时,它将转到第二个选项卡,该选项卡是景点的详图视图控制器。我想知道我怎样才能把景点的位置传给detailVC,这样我就可以在同一个地址拥有pin。这是我到目前为止所掌握的信息,其中存在一些不一致之处,因为细节vc上显示的地址与景点地址不相等

func performSearch(input:String) {

        attractionsMap.removeAnnotations(attractionsMap.annotations);

        matchingItems.removeAll()

        let request = MKLocalSearchRequest()
        request.naturalLanguageQuery = input
        println(input);
        request.region = attractionsMap.region;

        let search = MKLocalSearch(request: request)

        search.startWithCompletionHandler({(response:
            MKLocalSearchResponse!,
            error: NSError!) in

            if error != nil {
                println("Error occured in search: \(error.localizedDescription)")
            } else if response.mapItems.count == 0 {
                println("No matches found")
            } else {
                println("Matches found")

                for item in response.mapItems as! [MKMapItem] {
                    println("Name = \(item.name)")
                    println("Phone = \(item.phoneNumber)")

                    matchingItems.append(item as MKMapItem)
                    println("Matching items = \(matchingItems.count)")

                    var placemark = item.placemark;
                    var subThoroughfare:String = "";
                    var thoroughfare:String = "";
                    var locality:String = "";
                    var postalCode:String = "";
                    var administrativeArea:String = "";
                    var country:String = "";
                    var title = "";
                    var subtitle = "";

                    if (placemark.subThoroughfare != nil) {
                        subThoroughfare = placemark.subThoroughfare;
                    }
                    if(placemark.thoroughfare != nil) {
                        thoroughfare = placemark.thoroughfare;
                    }
                    if(placemark.locality != nil) {
                        locality = placemark.locality;
                    }
                    if(placemark.postalCode != nil) {
                        postalCode = placemark.postalCode;
                    }
                    if(placemark.administrativeArea != nil) {
                        administrativeArea = placemark.administrativeArea;
                    }
                    if(placemark.country != nil) {
                        country = placemark.country;
                    }
                    println("viewcontroller placmark data:");
                    println(locality);
                    println(postalCode);
                    println(administrativeArea);
                    println(country);

                    title = " \(subThoroughfare) \(thoroughfare) \n \(locality), \(administrativeArea) \n \(postalCode) \(country)";
                    subtitle = " \(subThoroughfare) \(thoroughfare)";
                    println(title);

                    var annotation = MKPointAnnotation()
                    annotation.coordinate = item.placemark.coordinate
                    annotation.title = item.name + " " + subtitle;
                    self.attractionsMap.addAnnotation(annotation)
                }
            }
        })
    }
这是搜索和添加pin注释的过程

然后我尝试发送下面的attractionLocation

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        var attractionsDetailViewController:AttractionsDetailViewController = segue.destinationViewController as! AttractionsDetailViewController
        attractionsDetailViewController.attractionLocation = indicatedMapItem;
    }
然后我的详细信息ViewController来实现给定的地址:

func getInfo() {
    var latitude = attractionLocation.latitude;
    var longitude  = attractionLocation.longitude;
    var latDelta:CLLocationDegrees = 0.000001
    var longDelta: CLLocationDegrees = 0.000001
    var span: MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta);
    var location = CLLocationCoordinate2DMake(latitude, longitude);
    var realLocation = CLLocation(latitude: latitude, longitude: longitude);
    CLGeocoder().reverseGeocodeLocation(realLocation, completionHandler: { (placemarks, error) -> Void in
        var title = ""
        var subtitle = ""
        var locality = ""
        if(error == nil) {
            if let placemark = CLPlacemark(placemark: placemarks?[0] as! CLPlacemark) {
                var subThoroughfare:String = "";
                var thoroughfare:String = "";
                var locality:String = "";
                var postalCode:String = "";
                var administrativeArea:String = "";
                var country:String = "";

                if (placemark.subThoroughfare != nil) {
                    subThoroughfare = placemark.subThoroughfare;
                }
                if(placemark.thoroughfare != nil) {
                    thoroughfare = placemark.thoroughfare;
                }
                if(placemark.locality != nil) {
                    locality = placemark.locality;
                }
                if(placemark.postalCode != nil) {
                    postalCode = placemark.postalCode;
                }
                if(placemark.administrativeArea != nil) {
                    administrativeArea = placemark.administrativeArea;
                }
                if(placemark.country != nil) {
                    country = placemark.country;
                }
                println("viewcontroller placmark data:");
                println(locality);
                println(postalCode);
                println(administrativeArea);
                println(country);

                title = " \(subThoroughfare) \(thoroughfare) \n \(locality), \(administrativeArea) \n \(postalCode)\(country)";
                subtitle = " \(subThoroughfare) \(thoroughfare)";
                println(title);
                self.addressLabel.text = title;

            }
        }
        var overallLoc = CLLocationCoordinate2DMake(latitude, longitude);
        var region:MKCoordinateRegion = MKCoordinateRegionMake(overallLoc, span);
        var annotation = MKPointAnnotation();
        annotation.coordinate = location;
        annotation.title = subtitle;
        self.detailMap.addAnnotation(annotation);
        self.detailMap.setRegion(region, animated: true)
    })
}

如果您在detailsVC中设置attractionLocation属性,如下所示

var attractionLocation: CLLocation?
var attractionAddress: String?
据我所知,getInfo函数只需要设置地图的区域并添加适当的注释。 由于attractionLocation属性将是CLLocation,因此我们可以访问它的坐标属性。如果您从第一个屏幕通过attractionAddress,则不需要使用CLGeocoder

func getInfo() {

    // Create span for the map region
    var latDelta:CLLocationDegrees = 0.000001
    var longDelta: CLLocationDegrees = 0.000001
    var span: MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta);


    // Create region for map
    var region:MKCoordinateRegion = MKCoordinateRegionMake(attractionLocation!.coordinate, span);
    var annotation = MKPointAnnotation();
    annotation.coordinate = attractionLocation!.coordinate;
    annotation.title = attractionAddress!;
    self.detailMap.addAnnotation(annotation);
    self.detailMap.setRegion(region, animated: true)
}

在过去,当涉及到反向地理编码时,我没有发现CLGeocoder的一致性。因此,至少通过这种方式,您可以确保两个屏幕之间的地址是一致的

您可以存储一个通常不推荐的全局变量,也可以通过segue传递,这是推荐的。最好不要再反向地理编码,因为反向地理编码并不总是最准确的定位方法

@您是否已将所需坐标传递到第二个选项卡?