需求:获取经纬度。

方案:我自定义了一个类模块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()

定位框一闪而过 iOS Swift的更多相关文章

  1. iOS swift的xcworkspace多项目管理(架构思想)

    iOS  swift的xcworkspace多项目管理(架构思想) 技术说明: 今天在这里分享 swift下的 xcworkspace多项目管理(架构思想),能为我们在开发中带来哪些便捷?能为我们对整 ...

  2. iOS Swift 模块练习/swift基础学习

    SWIFT项目练习     SWIFT项目练习2 iOS Swift基础知识代码 推荐:Swift学习使用知识代码软件 0.swift中的宏定义(使用方法代替宏) 一.视图  +控件 1.UIImag ...

  3. ios swift 实现饼状图进度条,swift环形进度条

    ios swift 实现饼状图进度条 // // ProgressControl.swift // L02MyProgressControl // // Created by plter on 7/2 ...

  4. Building gRPC Client iOS Swift Note Taking App

    gRPC is an universal remote procedure call framework developed by Google that has been gaining inter ...

  5. iOS Swift WisdomScanKit图片浏览器功能SDK

    iOS Swift WisdomScanKit图片浏览器功能SDK使用 一:简介      WisdomScanKit 由 Swift4.2版编写,完全兼容OC项目调用. WisdomScanKit的 ...

  6. iOS Swift WisdomScanKit二维码扫码SDK,自定义全屏拍照SDK,系统相册图片浏览,编辑SDK

    iOS Swift WisdomScanKit 是一款强大的集二维码扫码,自定义全屏拍照,系统相册图片编辑多选和系统相册图片浏览功能于一身的 Framework SDK [1]前言:    今天给大家 ...

  7. iOS Swift WisdomHUD 提示界面框架

    iOS Swift WisdomHUD 提示界面框架  Framework Use profile(应用简介) 一:WisdomHUD简介 今天给大家介绍一款iOS的界面显示器:WisdomHUD,W ...

  8. iOS Swift WisdomKeyboardKing 键盘智能管家SDK

    iOS Swift WisdomKeyboardKing 键盘智能管家SDK [1]前言:    今天给大家推荐个好用的开源框架:WisdomKeyboardKing,方面iOS日常开发,优点和功能请 ...

  9. iOS swift项目IM实现,从长连接到数据流解析分析之Socket

    iOS  swift项目IM实现,从长连接到底层数据解析分析之Socket 一:项目简介:  去年开始接手了一个国企移动项目,项目的需求是实现IM即时通讯功能. * 一期版本功能包括了:       ...

随机推荐

  1. ArcGIS Engine开发之视图同步

    数据视图与布局视图的同步 数据视图与布局视图的同步,首先要保证数据的一致性,其次就是数据显示范围的一致性.该同步主要涉及IMapControl接口的OnMapReplaced事件和OnAfterScr ...

  2. ExtPB.Net:窗体应用技巧(2)在树形导航下打开弹出的win窗口

    ExtPB.Net的demo程序有个树形导航菜单,里面的菜单打开的窗口放在右边的TabStrip控件中.我们可以设计win通过导航打开,但有时我们希望以弹出窗口的形式打开它,但怎么办呢?现在可以这样修 ...

  3. 自定义UITableViewCell实现左滑动多菜单功能LeftSwipe

    今天愚人节,小伙们,愚人节快乐! 实现一个小功能,滑动菜单,显示隐藏的功能菜单, 先上图:                       这里尝试用了下使用三个方式来实现了这个功能: 1.使用自定义UI ...

  4. iOS真机测试could not find developer disk image

    兄弟你该升级xcode的了,xcode的版本已经落后于手机的iOS版本了

  5. 总结Cnblogs支持的常用Markdown语法

    一.什么是Markdown Markdown是一种可以使用普通文本编辑器编写的标记语言, Markdown的语法简洁明了.学习容易,而且功能比纯文本更强,因此有很多人用它写博客.世界上最流行的博客平台 ...

  6. android px转换为dip/dp

    /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public int dipTopx(Context context, float dpValue) { final floa ...

  7. java简单模拟生产者消费者问题

    本文来自:http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和 ...

  8. MyBatis学习笔记(一)入门

    首先给大家推荐几个网页: http://blog.csdn.net/isea533/article/category/2092001    没事看看 - MyBatis工具:www.mybatis.t ...

  9. BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】

    2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1624  Solved: 853[Submit][Status][Discu ...

  10. C语言文法

    C语言文法 源程序 → 外部声明 | 子程序(外部声明) 外部声明   → 函数定义| 函数声明 函数定义 → 类型标识符(复合句) 标识符类型 → 无类型 | 字符型 | 整型 | 浮点型 整型→ ...