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

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

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

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

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

Q&A

1回答

2089閲覧

GoogleMap上のサークルにdelegateを与えてsegueで別のViewControllerに遷移できるようにしたいです

corecore

総合スコア12

Swift

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

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

0グッド

0クリップ

投稿2019/03/10 15:56

編集2019/03/12 02:36

Google Maps SDK for iOSを利用して地図上に円を描いて、その円をタップすると画面遷移するようにしたいと思い、公式のドキュメントを参考にして下のようなコードを書いたのですが、サークルをタップしても何も動きません。どこが間違っているのでしょうか?
######追加
何度もすみません
デリゲートの使い方
GMSMapViewDelegateのリファレンス
Google Maps SDK for iOS の使い方(Swift 4対応)
を参考にしてコードを書き換えましたがTappedCircleが呼ばれません。

######問題点
地図とサークルは表示されるのですが、タップしても反応しません

該当のソースコード

swift

1import UIKit 2import GoogleMaps 3import CoreLocation 4 5class ViewController: UIViewController, GMSMapViewDelegate{ 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additional setup after loading the view, typically from a nib. 10 11 12 13 // map 14 let camera = GMSCameraPosition.camera(withLatitude: 35.687396, longitude: 139.743924, zoom: 17) 15 let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera) 16 self.view = mapView 17 // mapView.isMyLocationEnabled 18 19 let circle = GMSCircle() 20 circle.position = CLLocationCoordinate2DMake(35.687396, 139.743924) 21 circle.radius = CLLocationDistance(10) 22 circle.fillColor = UIColor.blue 23 circle.isTappable = true 24 circle.map = mapView 25 func mapView(_ mapView: GMSMapView, didTapMarker: GMSCircle) -> Bool { 26 performSegue(withIdentifier: "goTalk", sender: nil) 27 return true 28 } 29 } 30 31 override func didReceiveMemoryWarning() { 32 super.didReceiveMemoryWarning() 33 // Dispose of any resources that can be recreated. 34 } 35 36 37 38 39 40}

###修正後のコード

swift

1import UIKit 2import GoogleMaps 3import CoreLocation 4 5class ViewController: UIViewController, GMSMapViewDelegate{ 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additional setup after loading the view, typically from a nib. 10 11 12 13 // map 14 15 let camera = GMSCameraPosition.camera(withLatitude: 35.687396, longitude: 139.743924, zoom: 17) 16 let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera) 17 mapView.delegate = self 18 self.view = mapView 19 // mapView.isMyLocationEnabled 20 21 let circle = GMSCircle() 22 circle.position = CLLocationCoordinate2DMake(35.687396, 139.743924) 23 circle.radius = CLLocationDistance(10) 24 circle.fillColor = UIColor.blue 25 // 26 circle.isTappable = true 27 circle.map = mapView 28 29 30 } 31 32 override func didReceiveMemoryWarning() { 33 super.didReceiveMemoryWarning() 34 // Dispose of any resources that can be recreated. 35 } 36 37 func TappedCircle(_ mapView: GMSMapView, didTapOverlay: GMSOverlay) -> Bool { 38 performSegue(withIdentifier: "goTalk", sender: nil) 39 return true 40 } 41 42 43 44}

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

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

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

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

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

fuzzball

2019/03/12 02:09

TappedCircleという名前はどこから出てきたのでしょうか? デリゲート関数の名前は決まっているものなので、勝手に変更してはいけません。
fuzzball

2019/03/12 02:40

>>それは初めて知りました delegateの勉強不足です。 名前は「mapView」だけではなく、 mapView(_ mapView:didTapMarker:) とか mapView(_ mapView:didTapOverlay) とか、引数名まで含めたものが名前になります。
corecore

2019/03/12 03:33

func mapView(_ mapView: GMSMapView, didTapOverlay: GMSOverlay) -> Bool { performSegue(withIdentifier: "goTalk", sender: nil) return true } に変更したところ Instance method 'mapView(_:didTapOverlay:)' nearly matches optional requirement 'mapView(_:didTap:)' of protocol 'GMSMapViewDelegate' Make 'mapView(_:didTapOverlay:)' private to silence this warning というエラーが出たので private func mapView(_ mapView: GMSMapView, didTapOverlay: GMSOverlay) -> Bool { performSegue(withIdentifier: "goTalk", sender: nil) return true } としましたが、mapViewは呼び出されませんでした
corecore

2019/03/12 03:46

そもそもデリゲート処理を実証するために必要なコードが足りないのでしょうか? 今書いているコードに誤りがあるのでしょうか? 何度も申し訳ありません
fuzzball

2019/03/12 03:50

正しい関数名はこちらでは分かりませんので、Xcodeの補完機能を使って入力してみて下さい。 didTapあたりまで入力すれば候補が表示されると思います。
t_obara

2019/03/18 08:43

↑の通りだと思いますよ。ドキュメントとは違う結果かもしれませんが、一番信頼できるのが補完機能です。
guest

回答1

0

GMSMapViewDelegate を適切に実装する必要があります。

viewDidLoad中でfunc定義した場合、単にローカル関数の定義にしかなりません。

ViewControllerのメソッドとしてGMSMapViewDelegateの実装をしてください。

投稿2019/03/11 01:27

t_obara

総合スコア5488

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

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

corecore

2019/03/11 02:07

class ViewController: UIViewController, GMSMapViewDelegate の部分でViwControllerのメソッドとしてGMSMapViewDelegateを実装できていないということでしょうか
t_obara

2019/03/11 03:10

func mapView(_ mapView: GMSMapView, didTapMarker: GMSCircle) -> Bool の実装位置が悪いと言っています
corecore

2019/03/11 03:12

ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問