在我的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)
答案 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
}
}
您意识到我不必手动设置title
,subtitle
和coordinate
属性,因为您的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请求加载的。