0

私は小さな地図アプリケーションに取り組んでいます。これまでのところ、地図のピンをドロップして保存するコードがあり、アプリを再度開いてもそのまま残ります。このクラスはメイン ビュー コントローラ用です。

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate, UISearchBarDelegate, UIPopoverPresentationControllerDelegate {

    var location: CLLocation!
    let locationManager = CLLocationManager()

    @IBOutlet weak var placesMap: MKMapView!
    @IBOutlet weak var addButton: UIBarButtonItem!
    @IBOutlet weak var moreStuff: UIButton!

    // Popover button action
    @IBAction func moreStuff(sender: AnyObject) {
        self.performSegueWithIdentifier("showMoreStuff", sender:self)
        moreStuff.adjustsImageWhenHighlighted = false
    }

    @IBAction func addButton(sender: AnyObject) {
        let annotation = MKPointAnnotation()
        annotation.coordinate = CLLocationCoordinate2D(latitude: self.placesMap.userLocation.coordinate.latitude, longitude: self.placesMap.userLocation.coordinate.longitude)
        self.placesMap.addAnnotation(annotation)
        self.locationManager.startUpdatingLocation()
    }

    // Location function
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let location = locations.last
        let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.004, longitudeDelta: 0.004))
        self.placesMap?.setRegion(region, animated: true)
        self.locationManager.stopUpdatingLocation()
        let locationDictionary:[String:Double] = ["latitude":center.latitude,"longitude":center.longitude]
        var locationArray = [[String:Double]]()
        if NSUserDefaults.standardUserDefaults().objectForKey("locationArray") != nil {
             locationArray = NSUserDefaults.standardUserDefaults().objectForKey("locationArray") as! [[String:Double]]
    }
        locationArray.append(locationDictionary)
        NSUserDefaults.standardUserDefaults().setObject(locationArray, forKey: "locationArray")
        NSUserDefaults.standardUserDefaults().synchronize()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.requestWhenInUseAuthorization()
        self.locationManager.startUpdatingLocation()
        self.placesMap?.showsUserLocation = true
        if NSUserDefaults.standardUserDefaults().objectForKey("locationArray") != nil {
            for dictionary in NSUserDefaults.standardUserDefaults().objectForKey("locationArray") as! [[String:Double]]{
                let center = CLLocationCoordinate2D(latitude: dictionary["latitude"]!, longitude: dictionary["longitude"]!)
                let annotation = MKPointAnnotation()
                annotation.coordinate = center
                self.placesMap?.addAnnotation(annotation)
            }
        }
    }

すべてのピン (メモリー) を一度にリセットできるボタンを追加したいと考えています。このボタンは、「PopoverOptions」と呼ばれる新しいシーンとクラスにあります。これを行う必要があるクラスから次のコードがありますが、ユーザーが押すとマップからピンが消えないため、機能していないようです!

@IBOutlet weak var resetMemories: UIButton!

@IBAction func resetMemories(sender: AnyObject) {
    func removeStoredLocations(){
        NSUserDefaults.standardUserDefaults().removeObjectForKey("locationArray")
        NSUserDefaults.standardUserDefaults().synchronize()
    }
}

ピンが削除されていない理由は何か分かりますか? ボタンのアウトレット/アクションと同様に、クラスが正しくリンクされていることを確認しました。

4

1 に答える 1

1

ユーザー デフォルト キーをクリアしますが、これらのピンを表示するビュー コントローラーのマップ ビューは変更しません。マップから注釈を削除するには、removeAnnotations を呼び出す必要があります。

注釈が削除されたことを検出して削除する viewWillAppear メソッドを追加できます。このようなもの:

func viewWillAppear(_ animated: Bool)
{
  if NSUserDefaults.standardUserDefaults().objectForKey("locationArray") == nil 
  {
    if let annotations = self.placesMap.annotations
      self.placesMap?.removeAnnotations(annotations)
  }
}

上記のコードは、注釈ディクショナリ全体が userDefaults から削除された場合にのみ、マップから注釈を削除するように記述されています。こうすることで、View Controller がフォーカスを取り戻すたびに注釈をリロードする必要がなくなります。

ところで、あなたの新しいシーンは「PopoverOptions」と呼ばれるとおっしゃいました。シーンがポップオーバーで表示される場合、上記は機能しない可能性があります。(ポップオーバーが閉じられたときにviewWillAppearがView Controllerで呼び出されるとは思いませんが、確かに覚えていません。)

于 2016-03-26T13:09:21.210 に答える