如何使用 Yelp 数据和放置 Pin 图 (Swift)

How to use Yelp data and drop Pins (Swift)

我目前正在使用 yelp api 读取文件,其中包含基于我执行的搜索生成的数据。我想使用生成数据中的位置字段放置 Pin 注释。

这是我的模特class餐厅

var resultQueryDictionary:NSDictionary!

class Resturant: NSObject {
    var name: String!
    var thumbUrl: String!
    var address: String!
    var jsonData: NSData!

    init(dictionary: NSDictionary) {
        name = dictionary["name"] as? String
        thumbUrl = dictionary["thumbUrl"] as? String
        address = dictionary["address"] as? String
    }

    class func searchWithQuery(query: String, completion: ([Resturant]!, NSError!) -> Void) {
        YelpClient.sharedInstance.searchWithTerm(query, success: { (operation: AFHTTPRequestOperation!, response: AnyObject!) -> Void in
            let responseInfo = response as! NSDictionary
            resultQueryDictionary = responseInfo
            println(responseInfo)

            }) { (operation: AFHTTPRequestOperation!, error: NSError!) -> Void in
         println(error)
        }
    }

}

我正在尝试制作一种方法,将 AttractionsViewController 中的所有图钉放在这里:

func performYelpSearch(query: String) {
        attractionsMap.removeAnnotations(attractionsMap.annotations)
        matchingItems.removeAll()
        Resturant.searchWithQuery(query, completion: { (BusinessList: [Resturant]!, error: NSError!) in
            if(error != nil) {
                println("Error occured in search: \(error.localizedDescription)")
            } else if BusinessList.count == 0 {
                println("No matches found")
            } else {
                println("Yelp matches found!")
                for business in BusinessList as [Resturant] {
                    self.Businesses.append(business)
                    var annotation = MKPointAnnotation()
                    var yelpBusinessMock: YelpBusiness = YelpBusiness(dictionary: resultQueryDictionary)
                    annotation.coordinate = yelpBusinessMock.location.coordinate
                    annotation.title = yelpBusinessMock.name
                    self.attractionsMap.addAnnotation(annotation)
                }
            }
        })
    }

但是,没有删除注释图钉,所以我有点困惑。

这是我的 annotationForViewMethod:

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
        if(annotation is MKUserLocation) {
            return nil;
        }
        let reuseId = "pin"
        var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView;
        if(pinView == nil) {
            pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId);
            pinView!.canShowCallout = true;
            pinView!.animatesDrop = true;

        }
        var moreInfoButton = UIButton.buttonWithType(UIButtonType.DetailDisclosure) as! UIButton;
        pinView?.rightCalloutAccessoryView = moreInfoButton;
        return pinView;
    }

我原来用的是 Apple 的 LocalSearch:

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)
                }
            }
        })
    }

这非常有效...

这就是您需要做的。

在您的餐厅模型中,您需要添加这段代码

let dataArray = responseInfo["businesses"] as! NSArray
            for business in dataArray {
                let obj = business as! NSDictionary
                var yelpBusinessMock: YelpBusiness = YelpBusiness(dictionary: obj)
                var annotation = MKPointAnnotation()
                annotation.coordinate = yelpBusinessMock.location.coordinate
                annotation.title = yelpBusinessMock.name
                map.addAnnotation(annotation)
            }

您希望将业务作为 NSArray,然后 dataArray 中的每个对象或业务都将是一个 NSDictionary,您将其传递到您的 yelpBusiness class。

这应该有效。