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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

Q&A

解決済

1回答

1097閲覧

位置情報を取得したい

sennin2911

総合スコア4

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

0グッド

0クリップ

投稿2020/06/21 16:42

位置情報を取得を行おうとしていますが、経度緯度が表示されません。
参考ページはリンクこちらになります。

コードは以下の通りです。

html

1// 2// ViewController.swift 3// MyPointMap 4// 5// Created by 蓑星友浩 on 2020/06/21. 6// Copyright © 2020 Sennin. All rights reserved. 7// 8 9import UIKit 10import CoreLocation 11 12class LocationViewController: UIViewController{ 13 14 @IBOutlet weak var latitude: UILabel! 15 @IBOutlet weak var longitude: UILabel! 16 17 var locationManager : CLLocationManager! 18 19 //緯度 20 var latitudeNow: String = "" 21 //経度 22 var longitudeNow: String = "" 23 24 25 26 override func viewDidLoad() { 27 super.viewDidLoad() 28 29 // ロケーションマネージャのセットアップ 30 setupLocationManager() 31 } 32 33 @IBAction func getLocationInfo(_ sender: Any) { 34 35 let status = CLLocationManager.authorizationStatus() 36 if status == .denied { 37 showAlert() 38 }else if status == .authorizedWhenInUse{ 39 self.latitude.text = latitudeNow 40 self.longitude.text = longitudeNow 41 } 42 } 43 44 45 @IBAction func clearLabel(_ sender: Any) { 46 47 self.latitude.text = "デフォルト" 48 self.longitude.text = "デフォルト" 49 50 } 51 52 53 func setupLocationManager(){ 54 55 locationManager = CLLocationManager() 56 57 //位置情報取得ダイアログの表示 58 guard let locationManager = locationManager else { return } 59 locationManager.requestWhenInUseAuthorization() 60 61 //マネージャの設定 62 let status = CLLocationManager.authorizationStatus() 63 //ステータス毎の処理 64 if status == .authorizedWhenInUse { 65 locationManager.delegate = self 66 //位置情報を取得を開始 67 locationManager.startUpdatingLocation() 68 } 69 70 71 72 } 73 74 //extensionの意味がわからない 75 76 77 //アラートの表示 78 func showAlert(){ 79 80 let alerTitle = "位置情報取得が許可されていません" 81 let alerMessage = "設定アプリの「プライバシー>位置情報サービス」から変更してください" 82 let alert: UIAlertController = UIAlertController( 83 title: alerTitle, message: alerMessage, preferredStyle: UIAlertController.Style.alert 84 ) 85 //OKボタン 86 let defaultAction: UIAlertAction = UIAlertAction( 87 title: "OK", style: UIAlertAction.Style.default, handler: nil 88 ) 89 90 //UIAlertControllerにActionを追加 91 alert.addAction(defaultAction) 92 //Alertを表示 93 present(alert, animated: true, completion: nil) 94 95 } 96 97} 98extension LocationViewController: CLLocationManagerDelegate{ 99 100 func locationManager(_manager:CLLocationManager, didUpdataLocations locations: [CLLocation]){ 101 102 let location = locations.first 103 let latitude = location?.coordinate.latitude 104 let longitude = location?.coordinate.longitude 105 106 self.latitudeNow = String(latitude!) 107 self.longitudeNow = String(longitude!) 108 109 } 110 111} 112

状態①
位置情報取得許可ダイアログの表示はうまくいきます。

状態②
参考ページリンクのように
[緯度:デフォルト]
[経度:デフォルト]
は表示されますが、[位置情報を取得]ボタンを押すと、空欄になります。

状態③
クリアボタンを押すと、空欄の状態から
[デフォルト]
[デフォルト]
が表示されます。

状態②において位置情報が取得されるようにしたいです。

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

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

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

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

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

hoshi-takanori

2020/06/21 23:40

位置情報が取得できたら extension のメソッドが呼ばれるので、そこでラベルに値をセットしましょう。 あと、_ と manager の間にスペースが必要です。
sennin2911

2020/06/22 14:01 編集

ご回答ありがとうございます。 初心者なので不明点が多いのですが、extensionの中で、ラベル(ここではlatitude.text、longitude.text)に代入しようしましたが、エラーがでます。 以下の様記載しています。 extension LocationViewController: CLLocationManagerDelegate{ func locationManager(_manager:CLLocationManager, didUpdataLocations locations:[CLLocation])  { let location = locations.first let latitude = location?.coordinate.latitude let longitude = location?.coordinate.longitude self.latitudeNow = String(latitude!) self.longitudeNow = String(longitude!) //追加した箇所 latitude.text = latitude longitude.text = longitude } } error : Value of type 'CLLocationDegrees?'(aka'Optional<Double>') has no mamber 'text' やろうとしていることが違いますでしょうか? ご指摘をよろしくお願いいたします。。
guest

回答1

0

ベストアンサー

error : Value of type 'CLLocationDegrees?'(aka'Optional<Double>') has no mamber 'text'

これは、locationの型であるCLLocationDegree?型(別名Optional<Double>型, aka = as known as)にはtextというメンバ(プロパティ)が存在しない、というエラーになります。

そんなはずはない、UILabel型として宣言したはずだと思われるかもしれませんが、その原因は下記にあります。

Swift

1class LocationViewController: UIViewController{ 2 3 @IBOutlet weak var latitude: UILabel! 4 @IBOutlet weak var longitude: UILabel!

ここで宣言した変数(プロパティ)と

Swift

1 func locationManager(_manager:CLLocationManager, didUpdataLocations locations: [CLLocation]){ 2 3 let location = locations.first 4 let latitude = location?.coordinate.latitude 5 let longitude = location?.coordinate.longitude

ここで宣言したプロパティが重複しています。
スコープ内、スコープ外双方で同じプロパティを宣言した場合には、同じスコープ(スコープ内)で宣言した方が優先されますから、selfをつけるなどして区別する必要がありますのでご確認ください。

Swift

1 self.latitude.text = latitude 2 self.longitude.text = longitude

ただし、同じような名前をつけるのは混乱の元ですから、できれば違う名前にした方が混乱は少なくなるのではないでしょうか。

例えばですが、

Swift

1 @IBOutlet weak var latitudeLabel: UILabel! 2 @IBOutlet weak var longitudeLabel: UILabel!

などです。

ただし、@IBOutletで宣言されたプロパティの名前を直接変更すると、今度は実行時エラーで落ちてしまいますので、変更するのであれば一度接続を切ったあと変更して(あるいは、その行を完全に削除して)から、改めて接続するようにお願いします。

投稿2020/06/25 08:27

TsukubaDepot

総合スコア5086

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問