teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

7

nil checkを修正

2019/11/22 06:58

投稿

hameji
hameji

スコア1380

answer CHANGED
@@ -74,8 +74,8 @@
74
74
  // 自分もnil check忘れてました。
75
75
  if let latitude = self.currentLatitude, let longitude = self.currentLongitude {
76
76
  // double型からString型へ、桁数指定とともに
77
- self.latitudeLabel.text = String(format: "%.4f", self.currentLatitude)
77
+ self.latitudeLabel.text = String(format: "%.4f", latitude)
78
- self.longitudeLabel.text = String(format: "%.4f", self.currentLongitude)
78
+ self.longitudeLabel.text = String(format: "%.4f", longitude)
79
79
  }
80
80
  }
81
81
  ```

6

nil ckeck追加

2019/11/22 06:58

投稿

hameji
hameji

スコア1380

answer CHANGED
@@ -71,9 +71,12 @@
71
71
  }
72
72
 
73
73
  func updateUILabeltext() {
74
+ // 自分もnil check忘れてました。
75
+ if let latitude = self.currentLatitude, let longitude = self.currentLongitude {
74
- // double型からString型へ、桁数指定とともに
76
+ // double型からString型へ、桁数指定とともに
75
- self.latitudeLabel.text = String(format: "%.4f", self.currentLatitude)
77
+ self.latitudeLabel.text = String(format: "%.4f", self.currentLatitude)
76
- self.longitudeLabel.text = String(format: "%.4f", self.currentLongitude)
78
+ self.longitudeLabel.text = String(format: "%.4f", self.currentLongitude)
79
+ }
77
80
  }
78
81
  ```
79
82
 

5

間違い修正

2019/11/22 06:57

投稿

hameji
hameji

スコア1380

answer CHANGED
@@ -41,11 +41,11 @@
41
41
 
42
42
  //データ書き込み
43
43
  func post() {
44
- // nilチェックし、取得前ならそもそも送信しない
44
+ // nilチェックし、gps取得前ならそもそも送信しない
45
45
  if let latitude = self.currentLatitude, let longitude = self.currentLongitude {
46
46
  // gps座標ありなので、送信(nilでない値=latitude, longitudeを使う)
47
47
  let postData = ["userLatitude": latitude, "userLongitude": longitude]
48
- ref.child("users").childByAutoId().setValue(post)
48
+ ref.child("users").childByAutoId().setValue(postData)
49
49
  } else {
50
50
  // nilの状態(=まだ取得されてない)なので、アラートなどでもどうぞ
51
51
  }

4

微修正

2019/11/22 06:54

投稿

hameji
hameji

スコア1380

answer CHANGED
@@ -8,7 +8,7 @@
8
8
  ```
9
9
  を入力し、送信する前の値を確認してみてはどうですか?
10
10
  ちなみに、LabelのtextプロパティはString型になりますからね。
11
- 結果からすると、Labelと出力されるはず???
11
+ データベースの結果からすると、Labelと出力されるはず???
12
12
 
13
13
  ちょっと考えたんですが、
14
14
  気になるのはlocationManagerがきちんと動いているかですね、
@@ -34,7 +34,7 @@
34
34
  @IBOutlet weak var mapView: MKMapView!
35
35
  @IBOutlet weak var latitudeLabel: UILabel! // なんであるかわかりやすいようにLabel付けました(Double型の数値でないことわかるように)
36
36
  @IBOutlet weak var longitudeLabel: UILabel! // なんであるかわかりやすいようにLabel付けました
37
- var currentLatitude: Double? = nil // この行追加、取得前はnil(何もない)です
37
+ var currentLatitude: Double? = nil // この行追加、GPS取得前はnil(何もない)です
38
38
  var currentLongitude: Double? = nil // この行追加
39
39
 
40
40
  // ~~間省略

3

大幅修正

2019/11/22 04:56

投稿

hameji
hameji

スコア1380

answer CHANGED
@@ -1,17 +1,80 @@
1
1
  ```Swift
2
2
  func post() {
3
-
4
3
  ```
5
4
  の次の行に
6
5
 
7
6
  ```Swift
8
7
  print("latitude:", latitude.text, "longitude:", longitude.text)
9
-
10
8
  ```
11
-
12
9
  を入力し、送信する前の値を確認してみてはどうですか?
13
10
  ちなみに、LabelのtextプロパティはString型になりますからね。
11
+ 結果からすると、Labelと出力されるはず???
14
12
 
15
- 結果からすると、Labelと出力されるはず???
13
+ ちょっ考えたんですが
16
- ちなみに気になったのはlocationManagerが動いているかです
14
+ 気になのはlocationManagerがきちんと動いているかです
17
- printで座標はコンソールに表示されるんですよね?
15
+ 座標はprintでコンソールに表示されるんですよね?
16
+ そしてから、postを押しましたか?
17
+
18
+ locationManagerで座標が取得される前の状態でPostを押したら、
19
+ おそらくstoryboardで設定されている文字(推測するに"Label"?)が送信されます。
20
+
21
+ なので、プログラムはきちんと書かれている通りに動いていると思います。
22
+ 書き方に問題があるということになります。
23
+
24
+ 通常なら、GPSの座標を保存する入れものを別に用意し、それでいろいろやります。
25
+ 例えば、
26
+ ```Swift
27
+ import UIKit
28
+ import Firebase
29
+ import MapKit
30
+ import CoreLocation
31
+
32
+ class ViewController: UIViewController, CLLocationManagerDelegate {
33
+
34
+ @IBOutlet weak var mapView: MKMapView!
35
+ @IBOutlet weak var latitudeLabel: UILabel! // なんであるかわかりやすいようにLabel付けました(Double型の数値でないことわかるように)
36
+ @IBOutlet weak var longitudeLabel: UILabel! // なんであるかわかりやすいようにLabel付けました
37
+ var currentLatitude: Double? = nil // この行追加、取得前はnil(何もない)です
38
+ var currentLongitude: Double? = nil // この行追加
39
+
40
+ // ~~間省略
41
+
42
+ //データ書き込み
43
+ func post() {
44
+ // nilチェックし、取得前ならそもそも送信しない
45
+ if let latitude = self.currentLatitude, let longitude = self.currentLongitude {
46
+ // gps座標ありなので、送信(nilでない値=latitude, longitudeを使う)
47
+ let postData = ["userLatitude": latitude, "userLongitude": longitude]
48
+ ref.child("users").childByAutoId().setValue(post)
49
+ } else {
50
+ // nilの状態(=まだ取得されてない)なので、アラートなどでもどうぞ
51
+ }
52
+ }
53
+
54
+ // ~~間省略
55
+
56
+ func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
57
+ // ここも変更しました。 nilをまだよく理解していないみたいですね。
58
+ guard let newLocation = locations.last else {
59
+ return
60
+ }
61
+ // 以降はnilを除外した、newLocationを用います。
62
+ // 地図の表示変更
63
+ let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)
64
+ let region = MKCoordinateRegion(center: newLocation.coordinate, span: span)
65
+ mapView.region = region
66
+ // 変数にセット
67
+ self.currentLatitude = newLocation.coordinate.latitude
68
+ self.currentLongitude = newLocation.coordinate.longitude
69
+ // UILabel更新, メンバ変数currentXXXを使うので、引数用いず。
70
+ updateUILabeltext()
71
+ }
72
+
73
+ func updateUILabeltext() {
74
+ // double型からString型へ、桁数指定とともに
75
+ self.latitudeLabel.text = String(format: "%.4f", self.currentLatitude)
76
+ self.longitudeLabel.text = String(format: "%.4f", self.currentLongitude)
77
+ }
78
+ ```
79
+
80
+ こんなのでどうでしょう。

2

追記

2019/11/22 04:54

投稿

hameji
hameji

スコア1380

answer CHANGED
@@ -12,4 +12,6 @@
12
12
  を入力し、送信する前の値を確認してみてはどうですか?
13
13
  ちなみに、LabelのtextプロパティはString型になりますからね。
14
14
 
15
- 結果からすると、Labelと出力されるはず???
15
+ 結果からすると、Labelと出力されるはず???
16
+ ちなみに気になったのは、locationManagerが動いているかですが、
17
+ printで座標はコンソールに表示されるんですよね?

1

微修正

2019/11/22 04:29

投稿

hameji
hameji

スコア1380

answer CHANGED
@@ -10,6 +10,6 @@
10
10
  ```
11
11
 
12
12
  を入力し、送信する前の値を確認してみてはどうですか?
13
- ちなみに、textFieldのtextプロパティはString型になりますからね。
13
+ ちなみに、LabelのtextプロパティはString型になりますからね。
14
14
 
15
15
  結果からすると、Labelと出力されるはず???