iOS_21团购_定位并根据经纬度,解析出城市名

//
//  LocationTool.m
//  帅哥_团购
//
//  Created by beyond on 14-8-22.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "LocationTool.h"
#import <CoreLocation/CoreLocation.h>

#import "City.h"
#import "MetaDataTool.h"

@interface LocationTool () <CLLocationManagerDelegate>
{
    // 定位管理器,作用是:定位当前用户的经度和纬度
    CLLocationManager *_mgr;
    // 地理位置解码编码器
    CLGeocoder *_geo;
}
@end
@implementation LocationTool
singleton_implementation(LocationTool)
// 工具类初始化时,创建 定位管理器、地理位置解码编码器,并设置代理为当前工具类
- (id)init
{
    if (self = [super init]) {
        // 定位管理器
        _mgr = [[CLLocationManager alloc] init];
        // 当它定位完成,获得用户的经度和纬度时,会通知代理
        _mgr.delegate = self;
        // 定位管理器 开始更新位置
        [_mgr startUpdatingLocation];
        // CLGeocoder可以根据刚才定位管理器定出的 经度和纬度,解码出用户所在位置的城市名
        _geo = [[CLGeocoder alloc] init];
    }
    return self;
}
#pragma mark - 定位管理器 代理方法,定位完毕时侯调用--1------3
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    // 1.既然已经定位到了用户当前的经纬度了,那么可以让定位管理器 停止定位了
    [_mgr stopUpdatingLocation];
    // 2.然后,取出第一个位置,根据其经纬度,通过CLGeocoder反向解析,获得该位置所在的城市名称,转成城市对象,用工具保存
    CLLocation *loc = locations[0];
    // 3.CLGeocoder反向通过经纬度,获得城市名
    [_geo reverseGeocodeLocation:loc completionHandler:
     ^(NSArray *placemarks, NSError *error) {
         // 从字典中取出 state---->某某市
         CLPlacemark *place = placemarks[0];
         NSString *cityName = place.addressDictionary[@"State"];
         // 将最后一个字符【市】去掉,转成城市对应,用工具保存
         cityName = [cityName substringToIndex:cityName.length - 1];
         // 从工具的城市字典中,根据城市名,取出对应的城市对象
         City *city = [MetaDataTool sharedMetaDataTool].allCitiesDict[cityName];
         // 设置当前城市对象,内部会拦截setter操作,并发出通知
         [MetaDataTool sharedMetaDataTool].currentCity = city;
         // 定位,并且解析完毕之后,用成员变量记住
         _locationCity = city;
         // 为成员属性赋值,供发起GET请求时,提供经纬度参数用
         _locationCity.position = loc.coordinate;
     }];
}

时间: 2024-10-14 10:15:48

iOS_21团购_定位并根据经纬度,解析出城市名的相关文章

iOS_21团购_【运行时】将字典转成对象模型

最终效果图: 核心代码: NSObject+Dict.h // // NSObject+Dict.h // 帅哥_团购 // // Created by beyond on 14-8-14. // Copyright (c) 2014年 com.beyond. All rights reserved. // 使用运行时,将dict转成对象 #import <Foundation/Foundation.h> @interface NSObject (Dict) // 一个对象,调用此方法,参数

iOS_21团购_拼音搜索

最终效果图: 关键代码: 搜索结果控制器: // // SearchResultController.m // 帅哥_团购 // // Created by beyond on 14-8-15. // Copyright (c) 2014年 com.beyond. All rights reserved. // 当搜索框searchBar里面的文字change的时候,会创建本控制器,展示搜索结果列表,本控制器只有唯一一个成员变量,那就是从CityLocationController控制器的sea

iOS_21团购_通过block对请求工具类的代理方法进行二次封装

最终效果图: [点评]提供的工具类DPAPI 在请求完毕后,使用的是代理机制,当一次请求成功或者失败时,会调用代理的相应方法 为了将点评提供的工具类DPAPI进行二次封装, 再次定义了一个block: typedef  void(^RequestDoneCallBackBlock)(id deals,NSError *err); 该block有两个参数, 分别是成功时,服务器返回的deals字典数组 另一个参数是:请求失败时,服务器返回的失败信息 两个参数分别对应代理的两个方法(即成功.失败时分

iOS_21团购_发送请求获取【点评】数据

请求结果简单显示: 用到的点评封装的类: 使用tableView简单展示: // // DealListController.m // 帅哥_团购 // // Created by beyond on 14-8-14. // Copyright (c) 2014年 com.beyond. All rights reserved. // 点击dock上面的[团购]按钮对应的控制器,上面是导航栏,导航栏右边是searchBar,导航栏左边是一个大按钮(TopMenu)(内部由三个小按钮组成<TopM

iOS_21团购_地图功能

最终效果图: 右下角的回到用户位置按钮: MapController控制器, 是主控制器左侧dock上面的[地图]按钮对应的控制器, 继承自ShowDealDetailController, 因此,自动拥有了展示团购详情控制器的功能 // // MapController.h // 帅哥_团购 // // Created by beyond on 14-8-14. // Copyright (c) 2014年 com.beyond. All rights reserved. // dock上面的

iOS_21团购_顶部菜单和弹出菜单联动

最后效果图: 各控件关系图1: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >\ 各控件关系图2: 点击Dock上面的buttonDockItem, 创建经导航控制器包装的DealListController, 而且加入到主控制器的右側空间 // // Deal

iOS_21团购_发送请求【点评】数据

结果表明,一个简单的请求: 用到的点评封装的类: 使用tableView简单展示: // // DealListController.m // 帅哥_团购 // // Created by beyond on 14-8-14. // Copyright (c) 2014年 com.beyond. All rights reserved. // 点击dock上面的[团购]button相应的控制器,上面是导航栏,导航栏右边是searchBar,导航栏左边是一个大button(TopMenu)(内部由

iOS_21团购_真正封装的团购详情控制器

最终效果图: DealDetailController控制器 // // DealDetailController.h // 帅哥_团购 // // Created by beyond on 14-8-20. // Copyright (c) 2014年 com.beyond. All rights reserved. // 真正的通过xib显示一个订单的详情的控制器 #import <UIKit/UIKit.h> @class Deal; @interface DealDetailContr

iOS_21团购_iPad中子控制器的屏幕适配

最终效果图: iPad中重要的屏幕适配技巧, 先添加一个contentView占位, 并且只在viewDidLoad方法中设置frame, 因为iPad中无论横屏还是竖屏,W都是窄的那一条边, 因此,先添加一个contentView到主控制器的右侧, 并让它随着主控制器宽高自动伸缩, 而子控制器的view只需添加到contentView中即可,x 0 y 0宽高就是contentView的bounds 代码片段: // // MainViewController.m // 帅哥_团购 // //