SwiftUIでリストに格納した位置情報を表示する
公開日: 2024-02-06 01:10:54
更新日: 2024-02-06 01:15:23
タップするたびに配列に格納した位置情報を取得するコード
ボタンを押すたびに、配列に格納した位置情報をずらしながら表示するコード。
testViewModel.getLocationData()の部分をタイマー関数で囲うと、毎秒位置情報を送信するコードを実現できる。
ContentView:画面描画
import SwiftUI
import CoreLocation
struct ContentView: View {
@State private var latitudeText: String = "緯度経度情報がここに表示されます"
@State private var longitudeText: String = ""
let testViewModel = TestViewModel()
var body: some View {
VStack {
Text(latitudeText)
.padding()
Text(longitudeText)
.padding()
Button(action: {
// ボタンがタップされた時のアクション
if let location = testViewModel.getLocationData() {
self.latitudeText = "緯度: \(location.coordinate.latitude)"
self.longitudeText = "経度: \(location.coordinate.longitude)"
}
}) {
Text("Tap me!")
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
}
}
}
}
TestViewModel:Viewから呼ばれる
import Foundation
import CoreLocation
/// ViewModel
class TestViewModel {
let locationModel = LocationModel()
func getLocationData() -> CLLocation? {
return locationModel.getTestLocation()
}
}
TestLocationModel:位置情報データ格納用モデル
import Foundation
/// TestLocationModel
class TestLocation {
// 配列 ここに対象テストデータをこの形式で貼り付ける
let testLocation: [(Double, Double)] = [
(35.1876684720224,137.176425305838),
(35.1876684720324,137.176425306838),
(35.1876684720424,137.176425307838),
(35.1876684720524,137.176425308838),
(35.1876684720624,137.176425309838)
]
// 次の位置情報を取得する関数
func getNextLocation(locationModel: LocationModel) -> (latitude: Double, longitude: Double)? {
if locationModel.arrayCount < testLocation.count {
let location = testLocation[locationModel.arrayCount]
locationModel.arrayCount += 1
return (latitude: location.0, longitude: location.1)
} else {
return nil
}
}
}
LocationModel:TestLocationModelから位置情報を呼び出し、ViewModelへ渡す
import Foundation
import CoreLocation
/// LocationModel
class LocationModel {
var arrayCount: Int = 0
let testModel = TestLocation()
func getTestLocation() -> CLLocation? {
let testModel = TestLocation()
// TestLocation から緯度経度を取得
let customLocation = testModel.getNextLocation(locationModel: self)
// 緯度経度から CLLocation オブジェクトを作成
let currentLocation = CLLocation(latitude: customLocation!.latitude, longitude: customLocation!.longitude)
print("\(Date())\n latitude: \(currentLocation.coordinate.latitude)\n longitude: \(currentLocation.coordinate.longitude)")
return currentLocation
}
}
