gpt4 book ai didi

swift - MKPointAnnotation 和 PFObject

转载 作者:行者123 更新时间:2023-11-30 13:45:08 27 4
gpt4 key购买 nike

摘要:使用应用程序中的解析链接(而非查询)注释

已完成:我想做的是让新创建的注释成为 PFObject。我尝试执行此操作的方法是获取基于 MKPointAnnotation 的坐标。然后将其转换为带有坐标的 PFObject。然后可以稍后作为实时更新进行查询。

问题还有一个问题是,使用提到的代码,我无法使用 MKPointAnnotation 来添加标题和 UIImage,除此之外,我需要的所有提示都是将所有这些组合在一起,最终能够从解析中查询。

func handleLongPress(getstureRecognizer : UIGestureRecognizer) {
if getstureRecognizer.state != .Began { return }

let touchPoint = getstureRecognizer.locationInView(self.mapView)
let touchMapCoordinate = mapView.convertPoint(touchPoint, toCoordinateFromView: mapView)
createAnnotation(touchMapCoordinate)

}

private func createAnnotation(coordinate: CLLocationCoordinate2D) {
print("createAnnotation")
let myAnnotation = MyAnnotation(coordinate: coordinate)
mapView.addAnnotation(myAnnotation)
myAnnotation.saveInBackground()


}

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
if !(annotation is MKPointAnnotation) {
return nil
}

let reuseId = "test"

var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
if pinView == nil {
pinView = MyAnnotation(annotation: annotation, reuseIdentifier: reuseId)
pinView!.image = UIImage(named:"Cloud9")
pinView!.canShowCallout = true

let rightButton: AnyObject! = UIButton(type: UIButtonType.ContactAdd)
pinView?.rightCalloutAccessoryView = rightButton as? UIView

最佳答案

我不太清楚你在问什么(例如链接(非查询)结果成为 PFObject)。

我理解您的问题如下:

  • 一系列CLLocationCooperative2D由用户创建
  • 您希望轻松地将这些坐标添加到MKMapView
  • 您希望轻松地将这些坐标存储在 Parse 后端
<小时/>

我认为对你来说最好的解决方案是创建一个自定义类,它是 PFObject 的子类并实现 MKAnnotation (我不太确定 你的意思唯一的解决方案是对 PFObject 进行子类化,在当前状态下,这也没有任何帮助。)

我尝试将示例项目与以下三个文件放在一起。它非常干净整洁,因为您可以使用以下三行代码来实现上述两个目标:

let myAnnotation = MyAnnotation(coordinate: coordinate)
mapView.addAnnotation(myAnnotation)
myAnnotation.saveInBackground() // Handle this background save better

请告诉我这是否有助于解决您的问题,否则请重新表述您的问题以使其更加清晰。

<小时/>

更新1:OP想要标题副标题图像功能。

titlesubtitle 属性并非 MKPointAnnotation 独有,而是 MKAnnotation 协议(protocol)的一部分,它用于在我的示例中创建 MyAnnotation。这意味着您只需将这两个属性添加到 MyAnnotation 即可获得您想要的功能。

关于图像,这不是 MKPinAnnotationView 的独特功能,而是更通用的 MKAnnotationView 的独特功能。实际上,image 属性在 MKPinAnnotationView 中没有用途。正如 image 属性的文档中所述:

You can use the `MKAnnotationView` class as is or subclass it to provide custom behavior as needed. 
The `image` property of the class lets you set the appearance of the annotation view without subclassing directly.

当使用MKPinAnnotationView时, View 将始终是一个图钉,这就是image属性没有用途的原因。

因此,为了使用此 image 属性,您需要在委托(delegate)方法 mapView:viewForAnnotation: 中使用 MKAnnotationView >来自MKMapViewDelegate

记住要设置mapView的委托(delegate)属性(我已经在 Storyboard中设置了它)。

我更新了我的答案以反射(reflect)更改。

<小时/>

代码:

//
// ViewController.swift
// ParseAnnotationFun
//
// Created by Stefan Veis Pennerup on 28/01/16.
// Copyright © 2016 Kumuluzz. All rights reserved.
//

import UIKit
import MapKit

class ViewController: UIViewController, MKMapViewDelegate {

// MARK: - Storyboard outlets

@IBOutlet weak var mapView: MKMapView!

// MARK: - Gesture Recognizers

@IBAction func longPressed(sender: UILongPressGestureRecognizer) {
print("longPressed")
if sender.state != .Began { return }

let touchPoint = sender.locationInView(mapView)
let touchMapCoordinate = mapView.convertPoint(touchPoint, toCoordinateFromView: mapView)
createAnnotation(touchMapCoordinate)
}

// MARK: - Model

private func createAnnotation(coordinate: CLLocationCoordinate2D) {
print("createAnnotation")
let myAnnotation = MyAnnotation(coordinate: coordinate)
mapView.addAnnotation(myAnnotation)
myAnnotation.saveInBackground() // Handle this background save better
}

// MARK: - MKMapViewDelegate

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
let id = "someIdentifier"
var view = mapView.dequeueReusableAnnotationViewWithIdentifier(id)

if view == nil {
view = MKAnnotationView(annotation: annotation, reuseIdentifier: id)
view?.canShowCallout = true
view?.image = UIImage(named: "oranges")
}

view?.annotation = annotation
return view
}

}
<小时/>
//
// MyAnnotation.swift
// ParseAnnotationFun
//
// Created by Stefan Veis Pennerup on 28/01/16.
// Copyright © 2016 Kumuluzz. All rights reserved.
//

import Foundation
import Parse
import MapKit

class MyAnnotation: PFObject, PFSubclassing, MKAnnotation {

// MARK: - Properties

@NSManaged var location: PFGeoPoint

// MARK: - Initializers

init(coordinate: CLLocationCoordinate2D) {
super.init()
location = PFGeoPoint(latitude: coordinate.latitude, longitude: coordinate.longitude)
}

override class func initialize() {
struct Static {
static var onceToken : dispatch_once_t = 0;
}
dispatch_once(&Static.onceToken) {
self.registerSubclass()
}
}

// MARK: - PFSubclassing protocol

static func parseClassName() -> String {
return "AnnotationPins"
}

// MARK: - MKAnnotation protocol

var coordinate: CLLocationCoordinate2D {
return CLLocationCoordinate2DMake(location.latitude, location.longitude)
}

var title: String? = "Awesome title"

var subtitle: String? = "Random subtitle"

}
<小时/>
//
// AppDelegate.swift
// ParseAnnotationFun
//
// Created by Stefan Veis Pennerup on 28/01/16.
// Copyright © 2016 Kumuluzz. All rights reserved.
//

import UIKit
import Parse

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

MyAnnotation.initialize()
Parse.setApplicationId("xxx",
clientKey: "xxx")

return true
}

}

关于swift - MKPointAnnotation 和 PFObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35051069/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com