使用 Core Data 在 Swift 3 中保存和检索 MKAnnotations
Posted
技术标签:
【中文标题】使用 Core Data 在 Swift 3 中保存和检索 MKAnnotations【英文标题】:Saving and Retrieving MKAnnotations in Swift 3 using Core Data 【发布时间】:2017-03-22 02:34:37 【问题描述】:在对 HitList 和 ToDo 应用程序进行了详尽的搜索和构建之后,我还没有进一步实现 Core Data 和 MKAnnotations 的使用。我看到了关于使用 NSFetchedResults、NSUserDefaults 或其他废话的各种建议。我想知道如何实现 pin 位置的保存,然后从 CoreData 中检索它。以下是我徒劳的尝试。
class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate
var locationManager: CLLocationManager!
var storedLocations: [StoredLocations]! = []
@IBOutlet weak var mapView: MKMapView!
@IBOutlet weak var markSpot: UIBarButtonItem!
@IBOutlet weak var segmentedControl: UISegmentedControl!
// Part of the Fail
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
override func viewDidLoad()
super.viewDidLoad()
navigationController?.isToolbarHidden = false
locationManager = CLLocationManager()
locationManager.requestWhenInUseAuthorization()
let trackingButton = MKUserTrackingBarButtonItem(mapView: mapView)
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
toolbarItems = [trackingButton, flexibleSpace, markSpot]
mapView.delegate = self
// More Fail
mapView.addAnnotation(getData() as! MKAnnotation)
// Miserable Fail.. Again
func getData()
do
storedLocations = try context.fetch(StoredLocations.fetchRequest())
catch
print("Fetching Failed")
@IBAction func markSpotPressed(_ sender: Any)
let annotation = MKPointAnnotation()
let userLatitude = mapView.userLocation.coordinate.latitude
let userLongitude = mapView.userLocation.coordinate.longitude
annotation.coordinate = CLLocationCoordinate2D(latitude: userLatitude, longitude: userLongitude)
annotation.title = "Dropped Pin"
mapView.addAnnotation(annotation)
// Another Part of the Fail
let newPin = StoredLocations(context: context)
newPin.latitude = userLatitude
newPin.longitude = userLongitude
(UIApplication.shared.delegate as! AppDelegate).saveContext()
【问题讨论】:
你的代码看起来离工作不远了;您需要遍历返回到storedLocations
的对象并使用纬度和经度重新创建注释对象
@Paulw11 知道我的一整天并没有完全浪费在阅读和构建演示上,这有点令人欣慰。如果我离得不远,我要么睡在上面,要么有人会过来帮助它。我的大脑被炸了。
【参考方案1】:
您的getData()
函数不会返回任何内容,即使返回,您也不希望它返回MKAnnotation
,因为您可能有多个存储对象。你可以让它返回一个MKAnnotation
的数组
override func viewDidLoad()
super.viewDidLoad()
navigationController?.isToolbarHidden = false
locationManager = CLLocationManager()
locationManager.requestWhenInUseAuthorization()
let trackingButton = MKUserTrackingBarButtonItem(mapView: mapView)
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
toolbarItems = [trackingButton, flexibleSpace, markSpot]
mapView.delegate = self
if let annotations = getData()
mapView.addAnnotations(annotations)
func getData() -> [MKAnnotation]?
do
storedLocations = try context.fetch(StoredLocations.fetchRequest())
var annotations = [MKAnnotation]()
for storedLocation in storedLocations
let newAnnotation = MKPointAnnotation()
newAnnotation.coordinate.latitude = storedLocation.userLatitude
newAnnotation.coordinate.longitude = storedLocation.userLongitude
annotations.append(newAnnotation)
return annotations
catch
print("Fetching Failed")
return nil
【讨论】:
这样就解决了。我在 storedLocations 中使用的变量之一的微小变化。感谢您的帮助,这个问题似乎没有在 SO 上得到解决,问题没有得到解答。现在我可以在这个周末继续删除。以上是关于使用 Core Data 在 Swift 3 中保存和检索 MKAnnotations的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3. 使用 Core Data 隐藏一个空的 tableView
Swift 3 Core Data - 如何同步保存上下文?
Swift 3 Core Data Migration with Progress Indicator 或 Activity Spinner