定位框一闪而过 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()
定位框一闪而过 iOS Swift的更多相关文章
- iOS swift的xcworkspace多项目管理(架构思想)
iOS swift的xcworkspace多项目管理(架构思想) 技术说明: 今天在这里分享 swift下的 xcworkspace多项目管理(架构思想),能为我们在开发中带来哪些便捷?能为我们对整 ...
- iOS Swift 模块练习/swift基础学习
SWIFT项目练习 SWIFT项目练习2 iOS Swift基础知识代码 推荐:Swift学习使用知识代码软件 0.swift中的宏定义(使用方法代替宏) 一.视图 +控件 1.UIImag ...
- ios swift 实现饼状图进度条,swift环形进度条
ios swift 实现饼状图进度条 // // ProgressControl.swift // L02MyProgressControl // // Created by plter on 7/2 ...
- Building gRPC Client iOS Swift Note Taking App
gRPC is an universal remote procedure call framework developed by Google that has been gaining inter ...
- iOS Swift WisdomScanKit图片浏览器功能SDK
iOS Swift WisdomScanKit图片浏览器功能SDK使用 一:简介 WisdomScanKit 由 Swift4.2版编写,完全兼容OC项目调用. WisdomScanKit的 ...
- iOS Swift WisdomScanKit二维码扫码SDK,自定义全屏拍照SDK,系统相册图片浏览,编辑SDK
iOS Swift WisdomScanKit 是一款强大的集二维码扫码,自定义全屏拍照,系统相册图片编辑多选和系统相册图片浏览功能于一身的 Framework SDK [1]前言: 今天给大家 ...
- iOS Swift WisdomHUD 提示界面框架
iOS Swift WisdomHUD 提示界面框架 Framework Use profile(应用简介) 一:WisdomHUD简介 今天给大家介绍一款iOS的界面显示器:WisdomHUD,W ...
- iOS Swift WisdomKeyboardKing 键盘智能管家SDK
iOS Swift WisdomKeyboardKing 键盘智能管家SDK [1]前言: 今天给大家推荐个好用的开源框架:WisdomKeyboardKing,方面iOS日常开发,优点和功能请 ...
- iOS swift项目IM实现,从长连接到数据流解析分析之Socket
iOS swift项目IM实现,从长连接到底层数据解析分析之Socket 一:项目简介: 去年开始接手了一个国企移动项目,项目的需求是实现IM即时通讯功能. * 一期版本功能包括了: ...
随机推荐
- ArcGIS Engine开发之视图同步
数据视图与布局视图的同步 数据视图与布局视图的同步,首先要保证数据的一致性,其次就是数据显示范围的一致性.该同步主要涉及IMapControl接口的OnMapReplaced事件和OnAfterScr ...
- ExtPB.Net:窗体应用技巧(2)在树形导航下打开弹出的win窗口
ExtPB.Net的demo程序有个树形导航菜单,里面的菜单打开的窗口放在右边的TabStrip控件中.我们可以设计win通过导航打开,但有时我们希望以弹出窗口的形式打开它,但怎么办呢?现在可以这样修 ...
- 自定义UITableViewCell实现左滑动多菜单功能LeftSwipe
今天愚人节,小伙们,愚人节快乐! 实现一个小功能,滑动菜单,显示隐藏的功能菜单, 先上图: 这里尝试用了下使用三个方式来实现了这个功能: 1.使用自定义UI ...
- iOS真机测试could not find developer disk image
兄弟你该升级xcode的了,xcode的版本已经落后于手机的iOS版本了
- 总结Cnblogs支持的常用Markdown语法
一.什么是Markdown Markdown是一种可以使用普通文本编辑器编写的标记语言, Markdown的语法简洁明了.学习容易,而且功能比纯文本更强,因此有很多人用它写博客.世界上最流行的博客平台 ...
- android px转换为dip/dp
/** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public int dipTopx(Context context, float dpValue) { final floa ...
- java简单模拟生产者消费者问题
本文来自:http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和 ...
- MyBatis学习笔记(一)入门
首先给大家推荐几个网页: http://blog.csdn.net/isea533/article/category/2092001 没事看看 - MyBatis工具:www.mybatis.t ...
- BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】
2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1624 Solved: 853[Submit][Status][Discu ...
- C语言文法
C语言文法 源程序 → 外部声明 | 子程序(外部声明) 外部声明 → 函数定义| 函数声明 函数定义 → 类型标识符(复合句) 标识符类型 → 无类型 | 字符型 | 整型 | 浮点型 整型→ ...