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

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

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1333閲覧

CalloutAccessoryViewのボタンを押してパラメータを遷移先に渡しながら画面遷移する

pftyuk

総合スコア52

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/08/06 12:36

いつもお世話になっております。

前提・実現したいこと

MapViewに配置されているアノテーションをタップすると
CalloutAccessoryViewが表示されるようになっており右側には
DetailDisclosureボタンが配置されています。
このボタンを押したときに、タップされたアノテーションの詳細を
詳細画面みたいな形にして、画面遷移させたいのですが
その際にパラメータを1つ遷移先に渡したいです。
現在の実装ではその渡すパラメータ(具体的にはAPIに投げるためのid)を
アノテーションのsubtitleに取り敢えず保存しておいて
以下の実装で遷移先に渡しているのですが、これだと当たり前ですが
subtitleが設定されているため、CalloutAccessoryViewに表示されてしまいます。
これをCalloutAccessoryViewに表示しない形で、ボタンが押された時に
アノテーションに対になって紐づいているidを遷移先に渡したいです。
宜しくお願い致します。

試したこと

Swift

1/// mapViewにマーカーを配置する 2 /// 3 /// - Parameters: 4 /// - title: マーカーのタイトル 5 /// - coodinate: マーカーの位置 6 private func setAnnotation(title:String?,id:String?,coodinate:CLLocationCoordinate2D){ 7 let annotation = MKPointAnnotation() 8 annotation.title = title 9 annotation.subtitle = id 10 annotation.coordinate = coodinate 11 self.mapView.addAnnotation(annotation) 12 } 13 14func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl){ 15 if control == view.rightCalloutAccessoryView{ 16 print("詳細ボタン押された") 17 18 let id = view.annotation?.subtitle 19 self.performSegue(withIdentifier: "toDetail", sender: id!) 20 } 21 } 22 23 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 24 if segue.identifier == "connectToDetail"{ 25 let detailView = segue.destination as! DetailViewController 26 detailView.id = sender as! String 27 } 28 } 29

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

カスタムクラスで入れ物を作ってあげてそれに入れてあげてはどうでしょうか。

private func setAnnotation(title:String?,id:String?,coodinate:CLLocationCoordinate2D){ let annotation = MyPointAnnotation() annotation.title = title annotation.identifier = id annotation.coordinate = coodinate self.mapView.addAnnotation(annotation) } func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl){ if control == view.rightCalloutAccessoryView { print("詳細ボタン押された") if let myAnnotation:MyPointAnnotation = view.annotation as? MyPointAnnotation { print(myAnnotation.identifier!) self.performSegue(withIdentifier: "toDetail", sender: myAnnotation.identifier!) } } } class MyPointAnnotation : MKPointAnnotation { var identifier: String? }

参考
How to set identifier in MKPointAnnotation

投稿2018/08/07 02:24

razuma

総合スコア1313

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pftyuk

2018/08/07 15:27

お世話になっております。 上記試したら期待通りの結果になりました! カスタムクラス試してたのですが if let myAnnotation:MyPointAnnotation = view.annotation as? MyPointAnnotation { print(myAnnotation.identifier!) self.performSegue(withIdentifier: "toDetail", sender: myAnnotation.identifier!) } ここに辿り着けてませんでした。 これはダウンキャストしてnilじゃなければ(nilにはならないはず) 画面遷移させてidを遷移先に渡してるってことですよね。 ずっと躓いていたので非常に助かりました。 いつもありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問