我正在使用XCode 8学习Swift,并且一直在开发这个简单的天气应用程序。该应用程序从openweather.org公共API获取当前天气和未来10天天气预报的数据。
在从具有静态纬度和经度的JSON格式的openweather API中提取数据并将其显示在UI(包含用于当前天气的UIView和用于10的预测数据的UITableView)方面,一切正常。天)。该应用程序看起来像 此 -
现在,我正在实施CoreLocation
协议,使用设备GPS获取纬度和经度(而不是硬编码坐标),然后将lat / long存储到单个类变量中。单身人士课程如下所示 -
import CoreLocation
class Location{
static var sharedInstance = Location()
private init(){}
var latitude: Double!
var longitude: Double!
}
现在在我的主ViewController中,我有一个函数初始化LocationManager
以获取设备位置(lat / long),然后将其存储到单例类变量latitude
和{{1}中}。该函数从longitude
调用。主视图控制器看起来像这样 -
ViewdidAppear
现在我有一个常量文件,它包含应用程序的某些全局常量,例如openweather API URL等。我想在这里使用单例类变量import UIKit
import CoreLocation
class WeatherVC: UIViewController, UITableViewDelegate, UITableViewDataSource, CLLocationManagerDelegate {
....
....
//IBOutlets etc.
//Some vars etc.
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startMonitoringSignificantLocationChanges()
......//a few more lines of code here
print(Location.sharedInstance.latitude,Location.sharedInstance.longitude)// this prints nil, nil
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
locationAuthStatus()
}
func locationAuthStatus(){
if CLLocationManager.authorizationStatus() == .authorizedWhenInUse{
currentLocation = locationManager.location
Location.sharedInstance.latitude = currentLocation.coordinate.latitude
Location.sharedInstance.longitude = currentLocation.coordinate.longitude
print(Location.sharedInstance.latitude,Location.sharedInstance.longitude) //this prints the correct values
}else{
locationManager.requestWhenInUseAuthorization()
locationAuthStatus()
}
}
}
和Location.sharedInstance.latitude
。常量文件有一个变量,可以构造2个API URL,如此 -
Location.sharedInstance.longitude
但是,let CURRENT_WEATHER_URL = "\(BASE_URL)\(LATITUDE)\(Location.sharedInstance.latitude)\(LONGITUDE)\(Location.sharedInstance.longitude)\(APP_ID)\(API_KEY)"
let FORECAST_WEATHER_URL = "\(FORECAST_URL)\(LATITUDE)\(Location.sharedInstance.latitude)\(LONGITUDE)\(Location.sharedInstance.longitude)\(FORECAST_CNT)\(APP_ID)\(API_KEY)"
和Location.sharedInstance.latitude
总是在Location.sharedInstance.longitude
函数之外返回nil
,因此locationAuthStatus()
和{{1}中的纬度/经度值}}显示为CURRENT_WEATHER_URL
,因此API调用失败。 FORECAST_WEATHER_URL
函数中有一个print语句,它正确打印nil
和locationAuthStatus()
值,但不知何故,这些值拒绝传播到应用程序的其余部分(在其他类中)。我尝试从项目中的所有其他类中打印这些类,并且所有类都返回Location.sharedInstance.latitude
。
我仍然在学习更多关于Singleton类和Swift的知识,但是对于我做错了什么的一些见解将会非常感激。