• 定位框一闪而过 iOS Swift


    需求:获取经纬度。

    方案:我自定义了一个类模块CLLocationModule.swift

    备注以下代码里 

    let IS_IOS8 = (UIDevice.currentDevice().systemVersion as NSString).doubleValue >= 8.0

    最开始的代码

    import UIKit

    import CoreLocation

    class CLLocationModule: NSObject ,CLLocationManagerDelegate{

        var latitude:Double?

        var longitude:Double?

        var city:NSString?

     

        func GetLatitudeLongitudeAndCity(){

            if CLLocationManager.locationServicesEnabled() == false {

                print("此设备不能定位")

                return

            }

            var locManager = CLLocationManager()        

            locManager.delegate = self

            locManager.desiredAccuracy = kCLLocationAccuracyBest        

            locManager.distanceFilter = 1000.0        

            //设置定位权限仅ios8有意义

            if IS_IOS8 {

                locManager.requestWhenInUseAuthorization()// 前台定位

                locManager.requestAlwaysAuthorization()

            }       

            locManager.startUpdatingLocation()

        }

        

        func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

            for location in locations {

                print("纬度:%g",location.coordinate.latitude);            

                print("经度:%g",location.coordinate.longitude);

                latitude = location.coordinate.latitude

                longitude = location.coordinate.longitude            

                self.saveLatitude(latitude!.description)

                self.saveLongitude(longitude!.description)            

                let geocoder: CLGeocoder = CLGeocoder()

                geocoder.reverseGeocodeLocation(location) { (placemarks, error) in

                    if error != nil {

                        print("reverse geodcode fail: (error!.localizedDescription)")

                        return

                    }

                    let pm = placemarks! as [CLPlacemark]

                    if (pm.count > 0){

                        for placemark :CLPlacemark in placemarks! {                        

                            let placemarkDict = placemark.addressDictionary

                            let placemarkStr = placemarkDict!["State"]

                            self.city = placemarkStr?.substringToIndex((placemarkStr?.length)!-1)

                            self.saveCity(self.city!)

                        }

                    }else{

                        print("No Placemarks!")

                    }

                }

            }        

            manager.stopUpdatingLocation()

        }

       

        func locationManager(manager:CLLocationManager, didFailWithError error:NSError) {

            print("locationManager error");        

        }

        

        func saveLatitude(latitude: NSString) {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            defaults.setObject(latitude, forKey: "latitude")

            defaults.synchronize()

        }

        

        func readLatitude() -> NSString {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            let latitude = defaults.objectForKey("latitude") as! NSString

            return latitude;

        }

        

        func saveLongitude(longitude: NSString) {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            defaults.setObject(longitude, forKey: "longitude")

            defaults.synchronize()

        }

        

        func readLongitude() -> NSString {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            let longitude = defaults.objectForKey("longitude") as! NSString

            return longitude;

        }

        

        func saveCity(city: NSString) {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            defaults.setObject(city, forKey: "city")

            defaults.synchronize()

        }

        

        func readCity() -> NSString {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            let city = defaults.objectForKey("city") as! NSString

            return city;

        }

    }

     

    外部调用是:

    CLLocationModule().GetLatitudeLongitudeAndCity()

    结果:定位框一闪而过 (允许 不允许那个弹出框) 导致不走代理方法didUpdateLocations 最后查阅网页 知道  

     

    (a)locManager没定义为全局变量 

    (b)自定义的CLLocationModule.swift这个类 由于ARC的缘故 自动释放了

    针对以上(a)问题的解决办法为自定义类CLLocationModule.swift中将var locManager = CLLocationManager() 改为全局变量

    var locManager: CLLocationManager!

    locManager = CLLocationManager()

    针对以上(b)问题的解决方案有两种

    (1)外部调用时改为:(改为强引用)

    var aCLLocationModule = CLLocationModule()

    self.aCLLocationModule.GetLatitudeLongitudeAndCity()

    (2)自定义的类CLLocationModule.swift改为单例

        //单例

        private static let aSharedInstance: CLLocationModule = CLLocationModule()

        private override init() {}

        class func sharedInstance() -> CLLocationModule {

            return aSharedInstance

        }

    外部调用时改为:

    CLLocationModule.sharedInstance().GetLatitudeLongitudeAndCity()

    成功的代码附上两份

    (1)单例

    import UIKit

    import CoreLocation

    class CLLocationModule: NSObject ,CLLocationManagerDelegate{

         //单例

        private static let aSharedInstance: CLLocationModule = CLLocationModule()

        private override init() {}

        class func sharedInstance() -> CLLocationModule {

            return aSharedInstance

        }

        

        var locManager: CLLocationManager! 

        var latitude:Double?

        var longitude:Double?

        var city:NSString?

        

        func GetLatitudeLongitudeAndCity(){        

            if CLLocationManager.locationServicesEnabled() == false {

                print("此设备不能定位")

                return

            }

            locManager = CLLocationManager()       

            locManager.delegate = self       

            locManager.desiredAccuracy = kCLLocationAccuracyBest        

            locManager.distanceFilter = 1000.0

            //设置定位权限仅ios8有意义

            if IS_IOS8 {

                locManager.requestWhenInUseAuthorization()// 前台定位

                locManager.requestAlwaysAuthorization()

            }        

            locManager.startUpdatingLocation()

        }

        

        func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

            for location in locations {

                print("纬度:%g",location.coordinate.latitude);            

                print("经度:%g",location.coordinate.longitude);

                latitude = location.coordinate.latitude

                longitude = location.coordinate.longitude           

                self.saveLatitude(latitude!.description)

                self.saveLongitude(longitude!.description)         

                let geocoder: CLGeocoder = CLGeocoder()

                geocoder.reverseGeocodeLocation(location) { (placemarks, error) in

                    if error != nil {

                        print("reverse geodcode fail: (error!.localizedDescription)")

                        return

                    }

                    let pm = placemarks! as [CLPlacemark]

                    if (pm.count > 0){

                        for placemark :CLPlacemark in placemarks! {

                            let placemarkDict = placemark.addressDictionary

                            let placemarkStr = placemarkDict!["State"]

                            self.city = placemarkStr?.substringToIndex((placemarkStr?.length)!-1)                        

                            self.saveCity(self.city!)

                        }

                    }else{

                        print("No Placemarks!")

                    }

                }

            }      

            manager.stopUpdatingLocation()

        }

       

        func locationManager(manager:CLLocationManager, didFailWithError error:NSError) {

            print("locationManager error");       

        }

        

        func saveLatitude(latitude: NSString) {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            defaults.setObject(latitude, forKey: "latitude")

            defaults.synchronize()

        }

        

        func readLatitude() -> NSString {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            let latitude = defaults.objectForKey("latitude") as! NSString

            return latitude;

        }

        

        func saveLongitude(longitude: NSString) {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            defaults.setObject(longitude, forKey: "longitude")

            defaults.synchronize()

        }

        

        func readLongitude() -> NSString {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            let longitude = defaults.objectForKey("longitude") as! NSString

            return longitude;

        }

        

        func saveCity(city: NSString) {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            defaults.setObject(city, forKey: "city")

            defaults.synchronize()

        }

        

        func readCity() -> NSString {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            let city = defaults.objectForKey("city") as! NSString

            return city;

        }

    }

    外部调用:

    CLLocationModule.sharedInstance().GetLatitudeLongitudeAndCity()

    (2)强引用

    import UIKit

    import CoreLocation

    class CLLocationModule: NSObject ,CLLocationManagerDelegate{

        var locManager: CLLocationManager!   

        var latitude:Double?

        var longitude:Double?

        var city:NSString?

        

        func GetLatitudeLongitudeAndCity(){        

            if CLLocationManager.locationServicesEnabled() == false {

                print("此设备不能定位")

                return

            }

            locManager = CLLocationManager()        

            locManager.delegate = self        

            locManager.desiredAccuracy = kCLLocationAccuracyBest        

            locManager.distanceFilter = 1000.0       

            //设置定位权限仅ios8有意义

            if IS_IOS8 {

                locManager.requestWhenInUseAuthorization()// 前台定位

                locManager.requestAlwaysAuthorization()

            }      

            locManager.startUpdatingLocation()

        }

        

        func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

            for location in locations {

                print("纬度:%g",location.coordinate.latitude);            

                print("经度:%g",location.coordinate.longitude);

                latitude = location.coordinate.latitude

                longitude = location.coordinate.longitude            

                self.saveLatitude(latitude!.description)

                self.saveLongitude(longitude!.description)            

                let geocoder: CLGeocoder = CLGeocoder()

                geocoder.reverseGeocodeLocation(location) { (placemarks, error) in

                    if error != nil {

                        print("reverse geodcode fail: (error!.localizedDescription)")

                        return

                    }

                    let pm = placemarks! as [CLPlacemark]

                    if (pm.count > 0){

                        for placemark :CLPlacemark in placemarks! {                        

                            let placemarkDict = placemark.addressDictionary

                            let placemarkStr = placemarkDict!["State"]

                            self.city = placemarkStr?.substringToIndex((placemarkStr?.length)!-1)                       

                            self.saveCity(self.city!)

                        }

                    }else{

                        print("No Placemarks!")

                    }

                }

            }        

            manager.stopUpdatingLocation()

        }

        

        func locationManager(manager:CLLocationManager, didFailWithError error:NSError) {        

            print("locationManager error");        

        }

        

        func saveLatitude(latitude: NSString) {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            defaults.setObject(latitude, forKey: "latitude")

            defaults.synchronize()

        }

        

        func readLatitude() -> NSString {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            let latitude = defaults.objectForKey("latitude") as! NSString

            return latitude;

        }

        

        func saveLongitude(longitude: NSString) {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            defaults.setObject(longitude, forKey: "longitude")

            defaults.synchronize()

        }

        

        func readLongitude() -> NSString {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            let longitude = defaults.objectForKey("longitude") as! NSString

            return longitude;

        }

        

        func saveCity(city: NSString) {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            defaults.setObject(city, forKey: "city")

            defaults.synchronize()

        }

        

        func readCity() -> NSString {

            let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

            let city = defaults.objectForKey("city") as! NSString

            return city;

        } 

    }

    外部调用:

    var aCLLocationModule = CLLocationModule()

    self.aCLLocationModule.GetLatitudeLongitudeAndCity()

     

     

  • 相关阅读:
    魔法方法中的__str__和__repr__区别
    新建分类目录后,点击显示错误页面?
    3.用while和for循环分别计算100以内奇数和偶数的和,并输出。
    2.for循环实现打印1到10
    1.while循环实现打印1到10
    021_for语句
    014_运算符_字符串连接
    020_while语句
    019_增强switch语句
    018_switch语句
  • 原文地址:https://www.cnblogs.com/huangzs/p/5334130.html
Copyright © 2020-2023  润新知