前提・実現したいこと
地図でユーザーが検索した地点を表示するようにしたいです。
発生している問題・エラーメッセージ
検索を実行するとRuntimeエラーが発生して、地図が更新されません。検索処理までは、データが入っているのでできているようです。
[SwiftUI] Modifying state during view update, this will cause undefined behavior.
該当のソースコード
SwiftUI
1struct ContentView: View { 2 3 @ObservedObject var coordinates = Coordinates.shared 4 @State private var inputText = "" 5 @State private var userTrackingMode: MapUserTrackingMode = .follow 6 7 var body: some View { 8 VStack{ 9 Map(coordinateRegion: $coordinates.region, interactionModes: .all, showsUserLocation: true, userTrackingMode: $userTrackingMode) 10 TextField("", text: $inputText, prompt: Text("場所を入力")) 11 .padding() 12 .onSubmit { 13 coordinates.localSearch(inputRegion: coordinates.region, inputText: inputText, completion: {targetRegion in 14 coordinates.region.center = targetRegion 15 }) 16 } 17 } 18 } 19} 20 21class Coordinates: ObservableObject { 22 23 public static let shared = Coordinates() 24 @Published var region: MKCoordinateRegion 25 26 init() { 27 region = MKCoordinateRegion(center: CLLocation().coordinate, latitudinalMeters: 500, longitudinalMeters: 500) 28 } 29 30 func localSearch(inputRegion: MKCoordinateRegion,inputText: String,completion: @escaping (CLLocationCoordinate2D) -> Void) { 31 let searchRequest = MKLocalSearch.Request() 32 searchRequest.naturalLanguageQuery = inputText 33 searchRequest.region = inputRegion 34 let search = MKLocalSearch(request: searchRequest) 35 search.start(completionHandler: {(response,error) in 36 guard let targetRegion = response?.mapItems.first?.placemark.coordinate else { return print("検索失敗!")} 37 completion(targetRegion) 38 }) 39 } 40}
試したこと
下記のホームページによれば、Viewの更新中にデータの修正をしようとしている事が原因らしいです。HPを参考にコードを修正しましたが、同じエラーが出てしまいます。
リンク内容
あなたの回答
tips
プレビュー