UIButtonを押してrealtimedatabaseからlatitude.textを取得したいのですが不明なnilが返ってきてエラーになります(Unexpectedly found nil while unwrapping an Optional value)
このページを参考にしながらやったのですが、解決方法がわかりません。アドバイスお願いします。
viewcontroller
1import UIKit 2import MapKit 3import CoreLocation 4import Firebase 5 6class FirstViewController: UIViewController, CLLocationManagerDelegate { 7 8 @IBOutlet weak var mapView: MKMapView! 9 @IBOutlet weak var latitude: UILabel! 10 @IBOutlet weak var longitude: UILabel! 11 let user = Auth.auth().currentUser?.uid 12 let locationManager = CLLocationManager() 13 var ref: DatabaseReference! 14 var otherUserLatitude: String? = nil 15 var otherUserLongitude: String? = nil 16 17 override func viewDidLoad() { 18 super.viewDidLoad() 19 ref = Database.database().reference() 20 locationManager.delegate = self as! CLLocationManagerDelegate 21 22 } 23 //保存できてます 24 @IBAction func userLocation(_ sender: Any) 25 { 26 let userCoordinate = ["userLatitude": latitude.text] 27 ref.child("users").setValue(["userCoordinate": userCoordinate]) 28 print("位置情報を保存しました") 29 } 30 @IBAction func othersLocation(_ sender: Any) 31 { 32 //Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional valueのエラー 33 ref.child("userLatitude").child(user!).observeSingleEvent(of: .value, with: { (snapshot) in 34 let value = snapshot.value as? NSDictionary 35 let otherUserLatitude = value?["userLatitude"] as? String 36 print("ユーザー緯度:", otherUserLatitude) 37 }) 38 } 39 40 func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 41 switch status { 42 case .notDetermined: 43 locationManager.requestWhenInUseAuthorization() 44 case .authorizedWhenInUse: 45 locationManager.startUpdatingLocation() 46 default: 47 break 48 } 49 } 50 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 51 if let coordinate = locations.last?.coordinate { 52 // 現在地を拡大して表示する 53 let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01) 54 let region = MKCoordinateRegion(center: coordinate, span: span) 55 mapView.region = region 56 } 57 guard let newLocation = locations.last else { 58 return 59 } 60 self.latitude.text = "".appendingFormat("%.4f", newLocation.coordinate.latitude) 61 self.longitude.text = "".appendingFormat("%.4f", newLocation.coordinate.longitude) 62 let location = locations.first 63 let latitude = location?.coordinate.latitude 64 let longitude = location?.coordinate.longitude 65 66 print("緯度: (latitude!)\n経度: (longitude!)") 67 } 68 69 70}
変数userがもしかしたらnilになっているとかはありませんか?
printとかで値を表示したらちゃんと表示されるか確認してみてもらえませんか?
ref.child("userLatitude").child(user!).observeSingleEvent(of: .value, with: { (snapshot) in
を
ref.child("userLatitude").observeSingleEvent(of: .value, with: { (snapshot) in
にして実行してみると
print("ユーザー緯度:", otherUserLatitude)
で
ユーザー緯度: nil
が出力されます。
ref.child("userLatitude").child(user!).observeSingleEvent(of: .value, with: { (snapshot) in の一つ上の行に print(user) を追加して結果を確認していただけませんか?
nilとなってます
ありがとうございます!それが原因っぽいですね。
ということはAuthにサインインしていないもしくは失敗している可能性があります。
確認ですが、Authにサインインする処理は実装されていますか?
Authにサインインすると言うのを具体的に教えていただけませんか?
Bundle Identifierを使ってfirebaseとの接続は出来てます。
横からすみません。
そもそもsetValue時にuserId使ってないので
```
@IBAction func userLocation(_ sender: Any)
{
let userCoordinate = ["userLatitude": latitude.text]
ref.child("users").setValue(["userCoordinate": userCoordinate])
print("位置情報を保存しました")
}
```
これで取れませんかね?
```
@IBAction func othersLocation(_ sender: Any)
{
//Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional valueのエラー
ref.child("users").child("userCoordinate").observeSingleEvent(of: .value, with: { (snapshot) in
let value = snapshot.value as? NSDictionary
let otherUserLatitude = value?["userLatitude"] as? String
print("ユーザー緯度:", otherUserLatitude)
})
}
```
出力、ユーザー緯度: Optional("35.5636")
で取れました!
ほんとに困ってたので助かりました!ありがとうございます!
ただprint(user)がnilなのは気になるところですが、、
ベストアンサーをさせて頂きたいので回答を編集して頂けると助かります。
popai306さん
確かに!そもそもuser使う必要ないですね????
もしAuthが気になるようでしたら、
一応公式のドキュメントを貼っておくので調べてみてください。
( https://firebase.google.com/docs/auth/ios/start?hl=ja )
hayabusabusashもありがとうございました!Authについて調べてみます!
回答1件
あなたの回答
tips
プレビュー