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

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

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

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

Swift

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

Q&A

解決済

1回答

2431閲覧

swiftUIのMapViewでbindingした変数の値を更新したい

watsa

総合スコア4

iOS

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

Swift

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

0グッド

0クリップ

投稿2020/05/11 14:28

編集2020/05/11 15:35

前提・実現したいこと

swift初学者です.
MapViewのupdateUIView上でswitch文を使い,画面上の押したボタンによってマップの拡大や縮小,現在地を画面の中心にするなどの処理をしています.switch文で判定している変数(bindingしています.)がMapView側で更新されず,同じ処理がループしてしまい,画面が固定されるような状態になってしまいます.
何か良い解決方法はないでしょうか?

考えられる要因
・画面を動かすたびに画面の中心の緯度,経度を常に更新しているため(?)

class Coordinator: NSObject, MKMapViewDelegate { var controll : MapView init(_ controll : MapView) { self.controll = controll } //ここで画面の中心の緯度,経度を渡している func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) { controll.centerCoordinate = mapView.centerCoordinate        //ここでも下のエラーメッセージがでる } }

これが要因であるなら一時的に読み取る処理をするべきだと思うのですが,実装方法がわかりません.

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

Modifying state during view update, this will cause undefined behavior.

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

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

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

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

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

hoshi-takanori

2020/05/11 21:59

SwiftUI のお作法に従って MapView を更新する必要があるってことだと思いますが、そのソースだけではよく分かりません。
guest

回答1

0

自己解決

UIViewRepresentable内のupdateUIViewでswitchにより処理を変えることで,マップの拡大や縮小,現在地を画面の中心にするなどの処理を実装しようとしていました.
これまではこのupdateUIView内でcasenumの値を更新すれば上手く動作するのではないかと実装してみたのですが,更新できておらず,同じ処理がループしているような状態でした.

UIViewRepresentable

1func updateUIView(_ uiView: MKMapView, context: UIViewRepresentableContext<MapView>) { 2 switch self.casenum { 3 case 1: 4 //ボタン1を押した時の処理 5 case 2: 6 //ボタン2を押した時の処理 7 case 3: 8 //ボタン3を押した時の処理 9 default: 10 //通常の処理 11 } 12  self.casenum = 0 //更新されない(上のエラーメッセージが出る) 13}

UIKitについてまだ知識がなく,勉強しなおしたところ,coordinatorによってイベントを処理していることがわかったので,マップデータのロードに成功したことをデリゲートに通知するfunc mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool)内でswitch文で判定している変数(casenum)を更新することで解決することができました.

Coordinator

1func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) { 2 controll.centerCoordinate = mapView.centerCoordinate 3 self.controll.casenum = 0 4}

これが最善の方法かどうかはわかりませんが,一応解決したので報告いたします.

投稿2020/05/17 17:40

watsa

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問