如何查询特定对象的解析类?

时间:2016-02-19 11:58:03

标签: ios database swift parse-platform

在我的ViewController我有一个标签,显示在之前ViewController中选择的俱乐部的名称。我现在需要从我的parse.com类创建一个查询,以检索与显示为标签的俱乐部名称匹配的对象的所有信息。我知道如何成功查询解析但我发现很难找到一种方法来匹配查询与标签字符串看到标签字符串可能会有所不同,具体取决于在上一个视图中选择的俱乐部。

代码:

import UIKit
import Parse

class MenuController: UIViewController {

    @IBOutlet weak var clubLabel: UILabel!

    var clubName = String()

    override func viewDidLoad() {
        super.viewDidLoad()

        clubLabel.text = clubName
    }
}

上一个视图已经查询解析用俱乐部注释填充地图,如下所示:

        let annotationQuery = PFQuery(className: "Clubs")
        annotationQuery.findObjectsInBackgroundWithBlock{
        (clubs, error) -> Void in
        if error == nil {
            // The find succeeded.
            print("Successful query for annotations")
            // Do something with the found objects
            let myClubs = clubs! as [PFObject]
            for club in myClubs {

                //data for annotation
                let annotation = MKPointAnnotation()
                 let place = club["location"] as? PFGeoPoint
                let clubName = club["clubName"] as? String
                let stadiumName = club["stadium"] as? String
                annotation.title = clubName
                annotation.subtitle = stadiumName
                annotation.coordinate = CLLocationCoordinate2DMake(place!.latitude,place!.longitude)

                //add annotations
                self.mapView.addAnnotation(annotation)

2 个答案:

答案 0 :(得分:0)

只需向whereKey添加PFQuery即可。

annotationQuery.whereKey(clubName, equalTo: "clubName")

希望这会有所帮助。

答案 1 :(得分:0)

我们将使用自定义注释来更轻松地理解,而不是使用默认的MKPointAnnotation

首先,我们将在不同的文件中创建符合ClubAnnotation协议的类MKAnnotation

import UIKit
import MapKit
import Parse

class ClubAnnotation: NSObject, MKAnnotation {

    //MARK: - Instance properties

    let club:PFObject

    //MARK: - Init methods

    init(club:PFObject) {
        self.club = club
    }

    //MARK: - MKAnnotation protocol conformance

    var title: String? { get {       
        return club["clubName"]
        }
    }

    var subtitle: String? { get {
        club["stadium"]
        }
    }

    var coordinate: CLLocationCoordinate2D { get {        
        return CLLocationCoordinate2D(latitude:  club["location"].latitude, longitude: club["location"].longitude)
        }
    }
}

如果Club对象的字段“stadium”,“clubName”或“location”为空,我会让您处理错误,因此您可以决定如何显示它。

然后,在包含MKMapView对象(可能符合MKMapViewDelegate协议)的类中,替换查询结果的处理:

let annotationQuery = PFQuery(className: "Clubs")
annotationQuery.findObjectsInBackgroundWithBlock{
    (clubs, error) -> Void in
    if let clubs = clubs where error == nil {
        // The find succeeded.
        print("Successful query for annotations")
        for club in clubs  {
            self.mapView.addAnnotation(ClubAnnotation(club:club))
        }
    } else {
        // Handle the error
    }
}

您意识到我不必手动设置titlesubtitlecoordinate属性,因为您的ClubAnnotation对象根据其MKAnnotation的实现直接返回它1}}协议。

仍在此课程中,添加selectedClub属性。此属性将用于从选定的注释中保存俱乐部,并将传递给推送的视图控制器。

var selectedClub:PFobject!

在你的calloutAccessoryControlTapped委托方法中,你可以从注释中获取你的PFObject,并将它传递给一个新的viewController,用它来做你想做的一切,而不必从Parse查询它:

    func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {

    mapView.deselectAnnotation(view.annotation, animated: true)

    if let annotation = view.annotation as? ClubAnnotation {            
       clubSelected = annotation.club
    }
}

您现在已经从自定义注释类中保存了俱乐部对象,并且您可以参考它。如果您想要显示或推送一个包含有关此俱乐部的更多信息的新视图控制器,只需覆盖prepareForSegue并将此值设置为推送/显示的视图控制器。您不需要查询俱乐部的其他字段,因为它们都是根据您的Parse请求加载的。