Swift - 当前位置拥有 struct/class (CLLocationManager)
Swift - Own struct/class for current location (CLLocationManager)
我想创建一个自己的结构或 class 来获取用户的当前位置。
我似乎无法在结构中使用 CLLocationManager 及其函数(didUpdateLocations、didFailWithError 等)(Xcode 使所有文本颜色变为黑色,我收到一条错误消息 An internal error occurred. Source editor is limited.
).当我使用 class 并尝试使用 "getPlacemark" 函数(从实例化的 class 中获取地标)或直接从创建的实例中获取地标时("instancedClass.placemarkInClass" ), 但没有任何效果,我只得到 Thread 1: EXC_BAD_ACCESS
。
这是我最后一次尝试创建 class:
import Foundation
import MapKit
class UserLocation: NSObject, CLLocationManagerDelegate{
var mLocationManager: CLLocationManager
var placemark: CLPlacemark
override init(){
placemark = CLPlacemark()
self.mLocationManager = CLLocationManager()
self.mLocationManager.desiredAccuracy = kCLLocationAccuracyBest
self.mLocationManager.requestWhenInUseAuthorization()
self.mLocationManager.startUpdatingLocation()
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error) -> Void in
if (error != nil) {
print("Error: " + (error?.localizedDescription)!)
return
}
if (placemarks?.count > 0) {
let pm = placemarks![0]
self.placemark = pm
print(self.placemark.areasOfInterest)
self.mLocationManager.stopUpdatingLocation()
}
})
}
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
print("Error: " + (error.localizedDescription))
}
func getPlacemark() -> CLPlacemark{
return self.placemark
}
}
在我的 ViewController 中,我将其设为实例变量 ( currentLocation = CurrentLocation() ) 并尝试同时使用
let userPlacemark = currentLocation.getPlacemark()
and
let userPlacemark = currentLocation.placemark
but nothing is working.
有没有办法拥有自己的 class 或结构来获取当前位置并在其他 ViewController 中使用它?
您的代码有两个观察结果:
一旦你完成成员变量的设置,你就不会在你的init中调用[super init]。修改你的初始化为
init(){
placemark = CLPlacemark()
mLocationManager = CLLocationManager()
mLocationManager.desiredAccuracy = kCLLocationAccuracyBest
mLocationManager.requestWhenInUseAuthorization()
mLocationManager.startUpdatingLocation()
super.init()
mLocationManager.delegate = self
}
正在设置位置管理器的委托。您应该在创建位置管理器实例后立即在 init 中执行此操作。参见上面的初始化代码。
我想创建一个自己的结构或 class 来获取用户的当前位置。
我似乎无法在结构中使用 CLLocationManager 及其函数(didUpdateLocations、didFailWithError 等)(Xcode 使所有文本颜色变为黑色,我收到一条错误消息 An internal error occurred. Source editor is limited.
).当我使用 class 并尝试使用 "getPlacemark" 函数(从实例化的 class 中获取地标)或直接从创建的实例中获取地标时("instancedClass.placemarkInClass" ), 但没有任何效果,我只得到 Thread 1: EXC_BAD_ACCESS
。
这是我最后一次尝试创建 class:
import Foundation
import MapKit
class UserLocation: NSObject, CLLocationManagerDelegate{
var mLocationManager: CLLocationManager
var placemark: CLPlacemark
override init(){
placemark = CLPlacemark()
self.mLocationManager = CLLocationManager()
self.mLocationManager.desiredAccuracy = kCLLocationAccuracyBest
self.mLocationManager.requestWhenInUseAuthorization()
self.mLocationManager.startUpdatingLocation()
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error) -> Void in
if (error != nil) {
print("Error: " + (error?.localizedDescription)!)
return
}
if (placemarks?.count > 0) {
let pm = placemarks![0]
self.placemark = pm
print(self.placemark.areasOfInterest)
self.mLocationManager.stopUpdatingLocation()
}
})
}
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
print("Error: " + (error.localizedDescription))
}
func getPlacemark() -> CLPlacemark{
return self.placemark
}
}
在我的 ViewController 中,我将其设为实例变量 ( currentLocation = CurrentLocation() ) 并尝试同时使用
let userPlacemark = currentLocation.getPlacemark() and let userPlacemark = currentLocation.placemark but nothing is working.
有没有办法拥有自己的 class 或结构来获取当前位置并在其他 ViewController 中使用它?
您的代码有两个观察结果:
一旦你完成成员变量的设置,你就不会在你的init中调用[super init]。修改你的初始化为
init(){ placemark = CLPlacemark() mLocationManager = CLLocationManager() mLocationManager.desiredAccuracy = kCLLocationAccuracyBest mLocationManager.requestWhenInUseAuthorization() mLocationManager.startUpdatingLocation() super.init() mLocationManager.delegate = self }
正在设置位置管理器的委托。您应该在创建位置管理器实例后立即在 init 中执行此操作。参见上面的初始化代码。