2017-09-14 23 views
0

注釈が地図上の長いジェスチャータップによって作成され、コアデータに保存されるアプリを作成しています。このresourceを確認しましたが、マップに表示されているアノテーションにはまだ問題があります。スウィフト2では何が変わっているのかわからなかったので、修正するために何が必要なのかわからなかった。ありがとう!ここに私のコードは次のとおりです。ここで注釈がコアデータで表示されない

import UIKit 
import MapKit 
import CoreData 

class MapViewController: UIViewController, MKMapViewDelegate { 

//Variables 

var locationManager = CLLocationManager() 
var currentPins = [Pin]() 
var gestureBegin: Bool = false 

var sharedContext: NSManagedObjectContext { 
    return CoreDataStack.sharedInstance().managedObjectContext 
} 

//Fetch All Pins 

func fetchAllPins() -> [Pin] { 
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Pin") 
    do { 
     return try sharedContext.fetch(fetchRequest) as! [Pin] 
    } catch { 
     print("Error In Fetch!") 
     return [Pin]() 
    } 
} 

//Outlets 

@IBOutlet weak var mapView: MKMapView! 

//Core Dat 
override func viewDidLoad() { 
    super.viewDidLoad() 

    let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(MapViewController.longPressGesture(longPress:))) 
    longPressRecognizer.minimumPressDuration = 1.5 
    mapView.addGestureRecognizer(longPressRecognizer) 

    self.mapView.delegate = self 

    addSavedPinsToMap() 

} 

//Add Saved Pin To Map 

func addSavedPinsToMap() { 
    currentPins = fetchAllPins() 
    print("Pins Count in Core Data Is \(currentPins.count)") 

    for currentPin in currentPins { 
     let annotation = MKPointAnnotation() 
     annotation.coordinate = currentPin.coordinate 
     mapView.addAnnotation(annotation) 
    } 
} 

//Long Press Gesture Recognizer 

func longPressGesture(longPress: UIGestureRecognizer) { 
    //Take Point 
    let touchPoint = longPress.location(in: self.mapView) 

    //Convert Point To Coordinate From View 
    let touchMapCoordinate = mapView.convert(touchPoint, toCoordinateFrom: mapView) 

    //Init Annotation 
    let annotation = MKPointAnnotation() 
    annotation.coordinate = touchMapCoordinate 

    //Init New Pin 
    let newPin = Pin(latitude: annotation.coordinate.latitude, longitude: annotation.coordinate.longitude, context: sharedContext) 

    //Save To Core Data 
    CoreDataStack.sharedInstance().saveContext() 

    //Adding New Pin To Pins Array 
    currentPins.append(newPin) 

    //Add New Pin To Map 
    mapView.addAnnotation(annotation) 
} 

} // End Class 

は私のコアデータファイルです:

import Foundation 
import CoreData 
import MapKit 

//Pin Class 
public class Pin: NSManagedObject { 

var coordinate: CLLocationCoordinate2D { 
    return CLLocationCoordinate2D(latitude: latitude, longitude: longitutde) 
} 

convenience init(latitude: Double, longitude: Double, context: NSManagedObjectContext) { 
    if let ent = NSEntityDescription.entity(forEntityName: "Pin", in: context) { 
     self.init(entity: ent, insertInto: context) 
     self.latitude = latitude 
     self.longitutde = longitude 

    } else { 
     fatalError("Unable To Find Entity Name!") 
    } 

} 
} 

そして、他のコアデータファイル:

私は私のタップを持っていなかったことを考え出した
import Foundation 
import CoreData 


extension Pin { 

@nonobjc public class func fetchRequest() -> NSFetchRequest<Pin> { 
    return NSFetchRequest<Pin>(entityName: "Pin") 
} 

@NSManaged public var latitude: Double 
@NSManaged public var longitutde: Double 

} 
+0

フェッチ要求のコードにソート記述子が表示されません(https://developer.apple.com/documentation/foundation/nssortdescriptor)。また、 'saveContext()'が実際に保存され、エラーで失敗していないことを確認してください。 – tmpz

答えて

0

私のVC内で適切にジェスチャーをセットアップしてください。アウトレットがVCに接続されたことを確認したら、すべて正常に機能しました。

関連する問題