質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.82%

地図のアノテーションについて

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 818

hajime35

score 12

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
swiftで地図アプリを作成しています。
アプリ読み込み時に自分のいる位置にアノテーションを表示し、画面を長押しするとさらにアノテーションを表示すしています。 それを配列に入れて、削除のボタンを押すと一つずつアノテーションを削除していきたいのです。

発生している問題・エラーメッセージ

画面長押しで表示するアノテーションは削除できますが
画面読み込み時に表示するアノテーションは削除できません。
配列に入れているのですが、、、

該当のソースコード

import UIKit
import Firebase
import MapKit
import CoreLocation

class SecondViewController: UIViewController , MKMapViewDelegate , CLLocationManagerDelegate,UIGestureRecognizerDelegate,UITextFieldDelegate ,
UIImagePickerControllerDelegate,UINavigationControllerDelegate{

var myIdo : Double = 0.000000
var myKeido : Double = 0.0000
var annotationlist = Array<MKPointAnnotation>()  // アノテーションの配列

//ここからUIのための宣言開始
@IBOutlet weak var message_Label: UILabel!
@IBOutlet weak var myMap: MKMapView!

@IBAction func Jihanki_Button(_ sender: Any) {
message_Label.text = "efgh"
}
@IBAction func Kyukei_Button(_ sender: Any) {
}
@IBAction func keshiki_Button(_ sender: Any) {
}
@IBAction func syokuji_Button(_ sender: Any) {
}
@IBAction func konbini_Button(_ sender: Any) {
}
@IBAction func jitensyaStore_Button(_ sender: Any) {
}

@IBAction func mapLomgPress(_ sender: UILongPressGestureRecognizer) {
guard sender.state == UIGestureRecognizer.State.ended else {  // 長押しの終了でのみ実行する
return //長押しの開始と最中はキャンセルする
}
let pressPoint = sender.location(in: myMap)   // 長押しの座標を取り出す
let pressCoordinate = myMap.convert(pressPoint, toCoordinateFrom: myMap) // マップの座標に変換する
let userDefaults = UserDefaults.standard
let Ido = pressCoordinate.latitude    //緯度を取り出す
let Keido = pressCoordinate.longitude
userDefaults.set(Ido,forKey : "緯度")  //ユーザデフォルトに保存して次の画面で使う
userDefaults.set(Keido,forKey : "経度")
// アノテーションを作る
let annotation = MKPointAnnotation()
annotation.coordinate = pressCoordinate
annotation.title = "ここに追加"
annotationlist.append(annotation) // アノテーションを配列に追加する
myMap.addAnnotation(annotation)// アノテーションを地図に表示する
}

// 虫ピンを使う
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
let pinView = MKPinAnnotationView()// ドラッグ可能なピンを作る
pinView.animatesDrop = true // 落ちてくる
pinView.isDraggable = true // ドラッグ可能
pinView.pinTintColor = UIColor.blue // 色
pinView.canShowCallout = true // タップでタイトル表示
pinView.rightCalloutAccessoryView = UIButton(type: UIButton.ButtonType.detailDisclosure)
return pinView

}

//ボタンを押された時
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
//画面遷移をコードでするのはしたの2行
let viewController = self.storyboard!.instantiateViewController(withIdentifier: "syousaiStoryboard")
self.present(viewController, animated: true, completion: nil)
}

//変数の宣言等
var locationManager = CLLocationManager()  //位置情報開始準備

override func viewDidLoad() {
super.viewDidLoad()
locationManager.requestWhenInUseAuthorization()  // アプリ利用中の位置情報の利用許可を得る
locationManager.delegate = self// ロケーションマネージャのdelegeteになる
setupLocationService()// ロケーション機能の設定
myMap.delegate = self  //ピン表示用デリゲートはこの1行だけ
startMapMyLoc()

}

// ロケーション機能の設定
func setupLocationService() {
locationManager.desiredAccuracy = kCLLocationAccuracyBest  // ロケーションの精度を設定する(ベスト)
locationManager.distanceFilter = 0.01  // ロケーションの精度を設定する(ベスト)
}
//
//    // 位置情報利用許可のステータスが変わった
//    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
//        switch status {
//        case .authorizedAlways, .authorizedWhenInUse :
//            // ロケーションの更新を開始する
//            locationManager.startUpdatingLocation()
//            let msg = "位置情報の利用が許可されている。"
//             message_Label.text = msg
//        case .notDetermined:
//            // ロケーションの更新を停止する
//            locationManager.stopUpdatingLocation()
//            disabledLocationLabel()
//        default:
//            // ロケーションの更新を停止する
//            locationManager.stopUpdatingLocation()
//            disabledLocationLabel()
//        }
//    }
//
//

// 位置を移動した
//    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
//        // locationsの最後の値を取り出す
//        let locationData = locations.last
//        // 緯度
//        if var ido = locationData?.coordinate.latitude {
//            ido = round(ido*1000000)/1000000
//            myIdo = Double(ido)
//        }
//        // 経度
//        if var keido = locationData?.coordinate.longitude {
//            keido = round(keido*1000000)/1000000
//            myKeido = Double(keido)
//        }
//        // 標高
//        if var hyoukou = locationData?.altitude {
//            hyoukou = round(hyoukou*100)/100
//
//        }
//    }

@IBAction func setCenter(_ sender: Any) {
startMapMyLoc()
}

@IBAction func removePin(_ sender: Any) {
// 最後に追加したピンを削除する
if annotationlist.count>0{
let lastPin = annotationlist.removeLast()
myMap.removeAnnotation(lastPin)
}
}

//位置情報が使えなかった場合にラベルを変更
func disabledLocationLabel() {
let msg = "位置情報の利用が許可されてない。"
message_Label.text = msg
}

//読み込み時に自分の位置をアップに表示するため
func startMapMyLoc() {
let center = myMap.userLocation.coordinate  // 中心座標
let span = MKCoordinateSpan(latitudeDelta: 0.02, longitudeDelta: 0.02)  // 表示範囲
let region = MKCoordinateRegion(center: center, span: span)// 地図の表示領域を決める
myMap.setRegion(region, animated:true)
// アノテーションを作る
let pressCoordinate = myMap.userLocation.coordinate
let annotation = MKPointAnnotation()
annotation.coordinate = pressCoordinate
annotation.title = "ここに追加"
annotationlist.append(annotation) // アノテーションを配列に追加する
myMap.addAnnotation(annotation)// アノテーションを地図に表示する
print(annotation)

}

}

試したこと

同じ配列に入れているつもりなのですが、、、

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • stdio

    2019/05/14 20:59

    ひとまず、やたらとソースコードに要らない部分があるので、もう少し絞ってから質問してもらえますか?

    キャンセル

  • fuzzball

    2019/05/15 16:45

    コードは ``` で囲って下さい。 https://teratail.com/help#about-markdown

    「削除できない」に関して、配列から削除できないのか、配列からは削除できているけど表示が消えないのか、など、もう少し具体的な状況を書いて下さい。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る