如何才能调用ios 获取appdelegatee的方法

IOS的AppDelegate方法中的事件触发调用
按home键是处理applicationDidEnterBackground了,程序处理applicationDidEnterBackground之后,系统会让程序有5秒钟的时间来保留数据,对于一般的数据存储,5秒足够了。
&&applicationWillTerminate
按home键不能被调用
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。如何怎么称呼方法和变量到 AppDelegate.swift?
还有 UIViewController ,被称为"家"。
它的类如下所示:
class Home: UIViewController, GKGameCenterControllerDelegate {
它包含一个方法,看起来像这样:
func animateStuff() {
let optionsAnimateStuff = UIViewAnimationOptions.Repeat | UIViewAnimationOptions.Autoreverse | UIViewAnimationOptions.AllowUserInteraction
UIView.animateWithDuration(1.0, delay: 3.0, options:
optionsAnimateStuff, animations: {
self.buttonPlay.transform = CGAffineTransformMakeScale(1.13, 1.13)
}, completion: { finished in
我尝试了包括此代码在 applicationDidBecomeActive AppDelegate 的方法:
let home = Home() as UIViewController
但都没有成功。如何可以调用整个 UIViewController 在 AppDelegate 文件中,我可以调用 animateStuff() 方法太?
解决方法 1:
如果家是你 rootViewController 然后你可以调用 animateStuff 方法从 appdelegate 方法这样做
if let viewController = self.window?.rootViewController? as? Home{
viewController.animateStuff()
如果家不是你的 rootViewContoller,然后你必须检查 presentedView 控制器是否回家然后调用它的方法
if let viewController = self.window?.rootViewController.presentedViewController as? Home{
viewController.animateStuff()
最后它看起来像你的 animateStuff 方法应该第一次设置的按钮转换到其初始状态
func animateStuff(){
let optionsAnimateStuff = UIViewAnimationOptions.Repeat | UIViewAnimationOptions.Autoreverse | UIViewAnimationOptions.AllowUserInteraction
self.buttonPlay.transform = CGAffineTransformMakeScale(1.0, 1.0)
UIView.animateWithDuration(1.0, delay: 3.0, options:
optionsAnimateStuff, animations: {
self.buttonPlay.transform = CGAffineTransformMakeScale(1.13, 1.13)
}, completion: { finished in如何用简单明了的话解释一下什么是 Objective-C 中的委托?
感觉无论是看书还是网上搜索,都不能完全弄明白什么是委托。是函数指针?还是什么?在StackOverFlow上看了半天,依然弄不懂。不知道知乎里有没有高人可以解答一下?
按投票排序
我就非常简单说一下,当然具体比这个要复杂。Delegate就是字面的意思,委托,自己不做事,委托别人干这事。对于一个类,不想直接去做但又有需求,就通过delegate交给别人去做。有些数据,你自己不想直接去获取,就通过delegate去找别人要。只要别人实现了你的delegate方法。比如UITableView,它需要知道自己的Cell的高度是多少。一般的做法是设置一个Height属性,其它代码直接对它赋值。而对于delegate来说,就不是这样。当它需要自己高度的时候,就会大声去喊:“喂,那个实现了我的delegate的家伙快给我高度数据!”具体表现就是它去找实现了heightForRowAtIndexPath的家伙,逼它交出高度数据。UITableViewCell的点击事件,也是delegate方法。因为有人点击了我以后需要干啥,我是不知道的,不同的人需求是不同的。那么我只是告诉你:“Hi,我被人点击了,你快去自己处理一下。”一些语言是直接写成OnClick事件,但如果要换人处理可能就比较麻烦,Objective-C中delegate就是处理人,直接赋值新的delegate,就换人处理这个事情了。具体为什么要怎么做,理由有很多了啦,多写代码和看别人的代码领会了。delegate确实把很多复杂的事情转成简洁的方式,比如类与类之间的通信啦等等等等……
Delegate?如果错了请忽略以下答案...对中文名词不大记住Delegate在OC里面可以理解成一个对象,对外回调的接口吧。我举例子说明一下。在一些餐厅,厨师做好了菜之后,会把菜放到小窗口,然后按一下铃。上菜员便会走过去把菜送到指定的桌子上。在这个例子里面,厨师就是一个对象,他有一个Delegate对象来帮他处理一些事件,比如“菜做好了”,又比如“冰箱里没红萝卜了”。其中,“菜做好了”,“冰箱里没红萝卜了”,这些就是在Delegate的定义里面声明了的方法,说明厨师可能会发出这些信号,要求你处理。而上菜员,就是一个实现了Delegate方法的对象。他专门负责处理厨师发出的某些信号。可能有点虚,我们结合OC最基础的 AppDelegate 来二次说明一下。每次新建项目,系统都会自动创建一个 xxxAppDelegate 的对象,而这个对象的实例,就是上面的 送菜员 角色。而程序(Application实例),就是厨师的角色。这个厨师(Application实例)的信号主要 有:“程序已经启动拉”,“程序要进入后台拉”,“程序又要出来拉”,这些则定义在了 UIApplicationDelegate 里面。基本概念大概就这些。-----分割线-------------------------下面说说Delegate怎么用。(不想篇幅太长,所以主要说使用已有的Delegate)最常用的Delegate应该是UI开头的那些Class。差不多所有的UIXXXView,都有对应的UIXXXViewDelegate使用 Delegate 的几个步骤:1)看看 Delegate 定义了哪些方法 (查看文档)2)找一个Class,实现这个Delegate( AClass:SuperClass 《The Delegate》(尖括号,打不出来...))3)实现 Delegate 里面的方法 (最常见的 UIView didLoad )4)为对象设置delegate (view.delegate = [AClass new] )
其实就是一种校验函数签名的函数指针。
校验函数签名可以保证在调用的时候,不会产生一些安全问题。所以使用委托来取代函数指针是一种安全的做法。
delegate 体现了mvc的思想啊
比如:一个view只管负责显示和响应事件。而一次事件到来的时候,往往有很多数据要处理,这时候通过delegate交给其他class去处理咯。
delegate就是2个对象之间的一种协议(protocol)。假设a是b的delegate,当b进行变化时,b有义务根据协议中定义的方法来通知a,告诉它这个变化(一般发生前后各要通知一次)。举例来说,一个UITableView对象把它的delegate设为一个UITableViewController对象,后者实现了UITableViewDelegate协议。当用户点击UITableView中的一个table cell时,UITableView接收到了这个事件,然后根据UITableViewDelegate协议,它需要调用UITableViewController的tableView:willSelectRowAtIndexPath:方法,这样后者也就能接收到这个事件了。另一个例子就是下载,NSURLConnection去进行下载了,主线程一般不能一直等着它完成下载吧。所以会需要一个controller去实现NSURLConnectionDelegate,并作为NSURLConnection的代理。这样当NSURLConnection完成下载后,就会调用后者的connectionDidFinishLoading:方法了。
一开始我对Delegation也是云里雾里。经过一段时间实践和浸淫,有了些许理解,分享如下,感觉比较适合初学者。个人见解,欢迎指正谬误。先举个例子:·假设你的软件有一个表格(UITableView)界面,当你点击了表格中的某行(cell),这个表格就说:“点我干嘛?我负责显示而已,其他事不关我的事。一边凉快去!”。不过,这个表格看到你猛搓屏幕、欲哭无泪的可怜样子,于是心软了,决定帮帮你。表格就拜托(委托)它的一个朋友帮忙,名字挺洋气的,叫“UITableViewController”(以下简称C),C就很仗义地帮忙了,当你再点击的时候,C就利用tableView:
didSelectRowAtIndexPath:方法,让你点击了表格后,有了相关的反馈(比如跳入下一页)。以上——“表格”委托“UITableViewController”处理点击事件。这就是“委托/ Delegation”,它就是一种思想,一种思路,一种“设计模式”。扩展1:为什么要用这种思想?·就我的理解,为了贯彻MVC这种设计模式。什么?不知道MVC?那“分工合作”总该理解吧。·继续上面的例子,表格(UITableView)为了更好、更专业地开展工作,它就计划着一门心思呆在显示界面这个岗位上,其他事情它不管。但是,软件的使用者是和界面直接打交道的,我点击你这个表格,你总要给我点反应吧?于是,很善长逻辑思维的UITableViewController就把这活儿接过来,专门从事软件的逻辑部分工作。这样“分工合作”,以后我们干什么活,就知道该找谁了。·这样分工合作后,你也可以直接把这个表格拖到其他程序,继续使用。(提高了重用性)。所以,“委托”的使用,是为了分工、为了降低程序的耦合性、为了重用。用它就对了,我们可是站在伟人的肩膀上。扩展2:我怎么知道可以委托谁?·上面例子中,表格委托了它朋友“C”办事,那在实际写代码中,我怎么知道要委托谁,或者怎么判断谁有能力帮上忙?·这就涉及到“协议/Protocol”了,“C”能帮忙,是因为它遵守了&UITableViewDelegate&这个协议,换句话说,只要遵守了&UITableViewDelegate&这个协议,阿猫阿狗(任何类)都能帮忙,都可以完成这个任工作。·那我怎么知道谁遵守了,谁没遵守协议?其实,控制权在你手中,你想让谁遵守都可以(只需在类名后的尖括号写上协议名称即可)——注意:“任何类都可以声明自身实现某个协议”(出处:维基百科)。(上面例子UITableViewController这个类,是系统自带的类,苹果把它搞出来的时候就遵守了&UITableViewDelegate&协议,天生就有能力帮忙。)·另外,子类继承父类,同时也继承父类遵守的协议。比如,我创建一个新类,继承的是“UITableViewController”这个类,那我创建的这个新类,并不用手动添加&UITableViewDelegate&协议,也同样具备能力协助表格处理点击事件。扩展3:协议/Protocol·现在大家知道“协议/Protocol”的作用没?它可以让你的小弟(你的类)拥有某种能力、变得三头六臂、无所不能。·协议的本质,是一个方法列表(里面的方法还没实现,等着你实现),协议中的方法分两种,分别用@required和@optional标记。标记了@required的方法,是“被委托对象"(UITableViewController)一定要实现的方法,不实现会报错;标记了@optional的方法,可以选择性实现。·如果方法什么都没标记,默认代表是@required方法。·如果现在还有人教你:协议分两种,一种正式协议、一种非正式协议,那建议你把这个人拖出去枪毙三分钟。苹果2006年发布的Objective-C 2.0”中,引入上述的@optional关键字后,就废弃了“非正式协议”,现在只有“协议/ Protocol”一种。(出处:维基百科)扩展4:“委托/ Delegation”与“协议/Protocol”的关系·通过上面,你应该了解“委托”和“协议”的大概关系了吧。要使用“委托”这种设计模式,就要用到“协议”,让被委托的对象(类)具备相应能力胜任工作。他俩是形影不离的了。
我画个图给你看看,希望能明白:
Delegate是运用Objective-C的运行时来实现的一种设计模式。官方文档的描述位置:iOS Library- & General- & Cocoa Fundamentals Guide- & Cocoa Design Patterns- &
How Cocoa Adapts Design Patterns- & Decorator- & Delegation国内镜像: 你看文档给出的位置就可以知道它的大概作用了,它是装饰器的一种实现。如果你熟悉设计模式的话,可以知道装饰器是动态实现给一个对象添加一些额外职责的设计模式。如果不是很清楚的话,请google 装饰器 设计模式 或者 Design Patterns Decorator,了解更多。那具体到Objective-C里,Delegate就是利用Objective-C 的运行时(Runtime)来实现动态的判断某对象是否存在,某对象是否实现了一些选择器(Selector),如果实现了,则通过调用该对象的某一选择器来帮助自己实现一些功能。在实际使用当中,设计一个自己的类Class的AClassDelegate可以通过两种方式实现,一种是非正式协议,Informal Protocol。正式协议,Protocol。比较新的类的设计都会使用Protocol是定义自己的Delegate方法,并为之标记可选还是必需实现。当一个类会作为另一个类的Delegate的时候,需要实现该Delegate的Protocol,这意味着如果有标记@required的相应方法,那该类的实例必需实现该方法。@optional的方法就并不一定要实现。举一个具体的例子:UINavigationController的Delegate应该是很少用到的,我看了一下也应该是比较简单的Delegate的设计。@protocol UINavigationControllerDelegate NSObject &@optional// Called when the navigation controller shows a new top view controller via a push, pop or setting of the view controller stack.- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)@end这个Delegate的方法都是可选实现的,不是必须的,所以通常大家比较少去主动用。那分析一下这个Delegate,我们可以知道,这个Delegate的设计是UINavigationController在show某一个ViewController的时候会对它的Delegate进行一种类似通知的调用:“我即将展示某某ViewController了”,那该Delegate可以通过实现这个方法进行相应的操作。举一个具体实现的例子//
AZDelegationDemo.h//
Created by Aladdin Zhang on 8/24/11.#import@protocol AZDelegationDemoD@interface AZDelegationDemo : NSObject{
idAZDelegationDemoDelegate &
NSMutableArray * shoppingL}@property (nonatomic,assign) idAZDelegationDemoDelegate &@end@interface AZDelegationDemo (informal_protocol_delegate)- (void)buyC@end@protocol AZDelegationDemoDelegate NSObject &@required- (void)buyP@optional- (void)buyM@end//
AZDelegationDemo.m//
Created by Aladdin Zhang on 8/24/11.#import "AZDelegationDemo.h"@implementation AZDelegationDemo@- (id)init{
self = [super init];
if (self) {
shoppingList = [NSMutableArray arrayWithCapacity:20];
}}- (void)buyStuff{
NSLog(@"My Shopping List %@",shoppingList);}- (void)weeklyShopping{
if (self.delegate&&[self.delegate conformsToProtocol:@protocol(AZDelegationDemoDelegate)]) {
[self.delegate performSelector:@selector(buyPork)];
if ([self.delegate respondsToSelector:@selector(buyMilk)]) {
[self.delegate performSelector:@selector(buyMilk)];
[shoppingList addObject:[NSString stringWithFormat:@"Milk"]];
if ([self.delegate respondsToSelector:@selector(buyCoffee)]) {
[self.delegate performSelector:@selector(buyCoffee)];
[shoppingList addObject:[NSString stringWithFormat:@"Coffee"]];
[self buyStuff];
}}@end这是我刚刚为这个回答写的一个例子,基本上涵盖了一般用途的Delegate的设计,这里不对具体Delegate的实现进行说明了,和其他系统提供的Delegate的使用基本一致。在这个例子中,我分别使用了分类(Category),即非正式协议,和协议(Protocol)来实现Delegate的设计。其实运用Objective-C的动态性,分类实现的协议和Protocol中的可选的协议方法,在调用上是一样的。使用正式协议,并标记为必需的好处是,可以通过编译器来帮助矫正不该出现的错误。
我觉得delegate就是个对象的引用吧,本身与protocol是没有关系的,我觉得上面几位老兄觉得“delegate就是protocol”有点没理解吧,id&SomeKindDelegate& delegate;是这delegate这个对象必须遵循某个协议,必须实现协议中required的方法。
大家不要因为delegate和protocol长期一起出现就把两者混淆了,楼上更是胡说了,protocol才相当于java中的接口的概念。
就是一个包含特定方法的实例指针,
类A,想要完成一个操作,自己不方便。类B,完成起来方便些。类A 设置 一个 id 类型的 遵守某个协议&xxxx& 的 delegate。类B 我知道这个协议。我来当你的代理,a.delegate = b。当了代理要办事的。类B 我做你协议里面要求的事。 实现 protocol中的方法。
在 Objective-C 中,一个对象会在特定情况下按照 SomeProtocol 中的定义,告诉它的 delegate 它自己将要做什么、已经做了什么、能不能做什么,以及与这些情况相关的变量。
通常,这些情况都是该对象最典型、最关键的行为集合,delegate 只要实现了这些方法就可以自定、控制这个类,而无需继承重写这个类。
自己形象的瞎说一下,不一定对。委托虽然和callback功能差不多但概念不太一样,callback是一个功能,委托还带有结构在里面。在flash 或js中 一般会对一个组件(例如按钮)添加一个事件监听器里面回调一个函数实现某个功能。
如果页面上很多组件例如很多按钮就会要很多事件监听器和不同的回调函数。而由于是同样的组件所拥有的可以监听的事件是相同的。例如多个按钮针对按钮的事件就几种,mousedown,mouseover等等。委托好在不需要做多余的事件监听的声明代码,该页面只要增加一行按钮的委托方法声明,直接在该页面就可以重写改组件的某个事件的功能,例如重写点击事件的方法mouseover就可以达到处理该页面所有按钮的mouseover事件, 到达组件事件的统一处理和管理。 代码少而且方便。相当于某些js或flash的一些框架功能,可以针对组件的事件统一管理
设计模式之观察者模式。无需多解释了。
delegate就是一名字,忽略名字吧,实际上就是用来实现类似callback功能的
其实类似 java 的 interface,定义了一个接口类,一个类想通过 interface 来让使用这个类的人做一些定制化的工作,但是又不想强求继承这个类,这时候就用让别人给一个 delegator 的实例,这个实例满足一定的接口,调用的时候是调用了 delegator 中实现了的函数。
委托就是秘书委托是objC中使用非常频繁的一种设计模式,它的实现与协议的使用是分不开的,让我们看一个综合示例:小公司老板日常的工作是管理公司、教导新员工、发工资与接电话。其中管理公司、教导新员工是老板要亲为的。而发工资与接电话老板希望招聘一个秘书来帮忙,于是对秘书的要求就是要略懂出纳发工资,要能帮助领导接电话。 而这两项要求便是协议,对类功能的限定。// SecProtocol.h
#import &Foundation/Foundation.h&
@protocol SecProtocol &NSObject&
然后定义一个秘书类// Sec.h
#import &Foundation/Foundation.h&
#import "SecProtocol.h"
@interface Sec : NSObject&SecProtocol&
#import "Sec.h"
@implementation Sec
- (id)init
self = [super init];
if (self) {
// Initialization code here.
-(void)payoff{
NSLog(@"sec payoff");
-(void)tel{
NSLog(@"sec tel");
紧接着是老板类:// Boss.h
#import &Foundation/Foundation.h&
#import "SecProtocol.h"
@interface Boss : NSObject
//此属性用于指定秘书对象,此对象必须实现SecProtocol协议。
@property(nonatomic,retain) id&SecProtocol&
//教导新员工
#import "Boss.h"
@implementation Boss
@synthesize detegate=_
- (id)init
self = [super init];
if (self) {
// Initialization code here.
-(void)manage{
NSLog(@"boss manage");
-(void)teach{
NSLog(@"boss teach");
-(void)payoff{
NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init];
[_detegate payoff];
[p release];
-(void)tel{
NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init];
[_detegate tel];
[p release];
那么老板就具有这4个方法,当调用前2个时是自己完成功能,而调用后2个时则转为调用秘书的方法。此时我们跟秘书对象就叫做代理对象,代理模式的名字由来于此。最后调用测试下:// main.m
// delegate
// Created by sxt on 11-10-23.
// Copyright 2011年 Jinlong Wei. All rights reserved.
#import &Foundation/Foundation.h&
#import "Boss.h"
#import "Sec.h"
int main (int argc, const char * argv[])
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
//实例化老板对象
Boss *boss=[[[Boss alloc] init] autorelease];
//实例化秘书对象
Sec *sec=[[[Sec alloc] init] autorelease];
//设置老板的代理对象为秘书
boss.detegate=
//调用4个方法。
[boss payoff];
[boss tel];
[boss manage];
[boss teach];
[pool drain];
就是提供一种机制,实现某种功能用来处理特定的情况,但是你在编写时并不清楚这种情况什么时候会发生,需要别人来调用你的这个功能,让外部程序在某个特定的时候调用你的代码。
比如说,通常写程序,都是你的代码去调用系统的功能,而当一些系统事件发生的时候,你可能会希望得到通知来执行一些操作,这时就需要delegate发挥作用了。同样,两个对象之间,一个对象希望另一个对象通知它某些事件的发生,就可以把自己注册为对方的某种委托。
c#里面也有delegate,java里没有语法上的支持,不过可以利用观察者模式来实现委托。对于c/c++,前面几位说了,callback、钩子,也都是这种机制。
C 中的函数指针.C#中也有个委托,没学过oc,根据C#类比的。
就是回调函数程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
IOS研究院之使用谷歌地图API在IOS设备上定位到自己(七)
IOS研究院之使用谷歌地图API在IOS设备上定位到自己(七)
围观10067次
编辑日期: 字体:
这两天抽时间学习了一下IOS下谷歌地图的API
现在很多APP中都会使用谷歌的地图。 个人觉得开发起来还是非常的便利的。废话不多说啦,赶快进入今天的正题。如下所示 这是MOMO的手机,这个项目我是在iPhone上调试的,这正是我的手机,模拟器上我没有试过,模拟器肯定是能打开谷歌地图的,但是好像不能定位地点。大家仔细看我下面的代码描述,其实很简单 真的很简单。本来今天晚上不像写这篇博文的,只是今天的北京雨下的太大了,困住了我回家的路,既然困在了公司那么当然要学习一下啦哈哈哈哈哈哈哈哈哈~~~
OK下面是代码片段。
创建一个工程,如下图所示,先将CoreLocation.framework 和 MapKit.framework
引入工程中,前者是负责定位的,后者是负责地图的。
AppDelegate.h
入口类,没什么好说的我就不解释了。
#import &UIKit/UIKit.h&#import "MapViewController.h"&@interface AppDelegate : UIResponder &UIApplicationDelegate&&@property (strong, nonatomic) UIWindow *window;@property (strong, nonatomic) UINavigationController *navController;@property (strong, nonatomic) UIViewController *viewController;@end
AppDelegate.m
12345678910111213141516171819202122232425262728
#import "AppDelegate.h"&@implementation AppDelegate&@synthesize window = _window;@synthesize navController;@synthesize viewController;&- (void)dealloc{&&&&[_window release];&&&&[super dealloc];}&- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{&&&&self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];&&&&&self.window.backgroundColor = [UIColor whiteColor];&&&&self.viewController =&&[[MapViewController alloc]init];&&&&self.navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];&&&&[self.window addSubview:navController.view];&&&&&[self.window makeKeyAndVisible];&&&&return YES;}&@end
主要的东东都写在MapViewController中,请大家仔细看这里。
MapViewController.h
123456789101112131415
#import &UIKit/UIKit.h&#import &MapKit/MKReverseGeocoder.h&#import &CoreLocation/CoreLocation.h&#import &MapKit/MapKit.h&&@interface MapViewController : UIViewController&CLLocationManagerDelegate,MKMapViewDelegate&{&&& //地图视图, 谷歌地图将加载在这个视图中喔&& MKMapView *myMapView ;&& //地图定位管理器&& CLLocationManager *_locManager ;}&@end
MapViewController.m 注意看这个类噢。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
#import "MapViewController.h"&@implementation MapViewController&- (void)dealloc{&&&&[_locManager release];&&&&[super dealloc];}&- (void)viewDidLoad{&&&&&[super viewDidLoad];&&&&& self.navigationItem.title&&= @"雨松MOMO";&&&&&
myMapView = [[[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)] autorelease]; myMapView.delegate = self;&&&&//在这里先让地图视图隐藏起来,&&&&//等获取当前经纬度完成后在把整个地图显示出来&&&&myMapView.hidden = true;&&&&[self.view addSubview:myMapView];&&&&&//创建定位管理器,&&&&_locManager = [[CLLocationManager alloc] init];&&&&[_locManager setDelegate:self];&&&&[_locManager setDesiredAccuracy:kCLLocationAccuracyBest];&& &}&-(void) viewWillAppear:(BOOL)animated{&&&&&[super viewWillAppear:animated];&&&&&//开始使用手机定位,这是一个回调方法,&&&&//一旦定位完成后程序将进入&&&&//- (void)locationManager:(CLLocationManager *)manager&&&&//didUpdateToLocation:(CLLocation *)newLocation&&&&//fromLocation:(CLLocation *)oldLocation&&&&//方法中&&&&&[_locManager startUpdatingLocation];&}&//定位成功后将进入此方法- (void)locationManager:(CLLocationManager *)manager&&&&didUpdateToLocation:(CLLocation *)newLocation&&&&&&&&&& fromLocation:(CLLocation *)oldLocation{&&&&&//得到当前定位后的经纬度,当前经纬度是有一定偏移量的,&&&&//使用另一种方法可以很好的解决这个问题&&&&CLLocationCoordinate2D loc = [newLocation coordinate];&&&&float lat =&&loc.latitude;&&&&float lon = loc.longitude;&&&&&//让MapView使用定位功能。&&&&myMapView.showsUserLocation =YES;&&&&&//更新地址,&&&&[manager stopUpdatingLocation]; &&&&&//设置定位后的自定义图标。&&&&MKCircle* circle = [MKCircle circleWithCenterCoordinate:CLLocationCoordinate2DMake(myMapView.userLocation.location.coordinate.latitude, myMapView.userLocation.location.coordinate.longitude) radius:5000];&&&&&//一定要使用addAnnotation 方法把MKCircle加入进视图,&&&&// 否则下面刷新图标的方法是永远不会进入的 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id &MKAnnotation&)&&&&//切记!!!!&&&&[myMapView addAnnotation:circle];&&&&& //我们需要通过当前用户的经纬度换成出它现在在地图中的地名&&&& CLGeocoder *geocoder = [[[CLGeocoder alloc] init] autorelease];&&&&[geocoder reverseGeocodeLocation: _locManager.location completionHandler:&&&& ^(NSArray *placemarks, NSError *error) {&&&&&&&&& //得到自己当前最近的地名&&&&&&&& CLPlacemark *placemark = [placemarks objectAtIndex:0];&&&&&&&&& NSString *locatedAt = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];&&&&&&&&& //locatedAt就是当前我所在的街道名称&&&&&&&& //上图中的中国北京市朝阳区慧中北路&&&&&&&& [myMapView.userLocation setTitle:locatedAt];&&&&&&&& [myMapView.userLocation setSubtitle:@"雨松MOMO在这里噢"]; &&&&&&&&& //这里是设置地图的缩放,如果不设置缩放地图就非常的尴尬,&&&&&&&& //只能光秃秃的显示中国的大地图,但是我们需要更加精确到当前所在的街道,&&&&&&&& //那么就需要设置地图的缩放。&&&&&&&& MKCoordinateRegion theRegion = { {0.0, 0.0 }, { 0.0, 0.0 } };&&&&&&&& theRegion.center= myMapView.userLocation.location.coordinate;&&&&&&&&& //缩放的精度。数值越小约精准&&&&&&&& theRegion.span.longitudeDelta = 0.01f;&&&&&&&& theRegion.span.latitudeDelta = 0.01f;&&&&&&&& //让MapView显示缩放后的地图。&&&&&&&& [myMapView setRegion:theRegion animated:YES]; &&&&&&&&& //最后让MapView整体显示, 因为截至到这里,我们已经拿到用户的经纬度,&&&&&&&& //并且已经换算出用户当前所在街道的名称。&&&&&&&& myMapView.hidden = false;&&&& }];&}&//定位失败后将进入此方法- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {&&&&&&&if ( [error code] == kCLErrorDenied )&&&&{&&&&&&&&&&&//第一次安装含有定位功能的软件时&&&&&&&&//程序将自定提示用户是否让当前App打开定位功能,&&&&&&&&//如果这里选择不打开定位功能,&&&&&&&&//再次调用定位的方法将会失败,并且进到这里。&&&&&&&&//除非用户在设置页面中重新对该软件打开定位服务,&&&&&&&&//否则程序将一直进到这里。&&&&&&&&UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"定位服务已经关闭"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&message:@"请您在设置页面中打开本软件的定位服务"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];&&&&&&&&[alert show];&&&&&&&&[alert release];&&&&&&&&[manager stopUpdatingHeading];&&&&}&&&&else if ([error code] == kCLErrorHeadingFailure)&&&&{&&&&&&&}}&&&//在这里我们设置自定义图标来 标志当前我在地图的地方- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id &MKAnnotation&)annotation;{&&&&static NSString *identifier = @"com.xys.momo";&&&&&MKAnnotationView *pin = [ mapView dequeueReusableAnnotationViewWithIdentifier:identifier ];&&&&if ( !pin )&&&&{&&&&&&&&&&&&&pin = [ [ MKAnnotationView alloc ] initWithAnnotation:annotation reuseIdentifier:identifier ];&&&&&&&&&&&&//随便加载了一张ICON&&&&&&&&&&&&//我的icon的大小是48X48 大家可根据仔细的喜好制定自己的icon&&&&&&&&&&&&pin.image = [ UIImage imageNamed:@"0.jpg" ];&&&&&&&&&&&&&//在图中我们可以看到图标的上方,有个气泡弹窗里面写着当前用户的位置所在地&&&&&&&&&&&&//原因是这里需要设置了True&&&&&&&&&&&&pin.canShowCallout=YES;&&&&&&&&&&&&//上图气泡的右侧还有一个带箭头的小按钮&&&&&&&&&&&&//这个按钮就是在这里创建的,不过MOMO目前没有写按钮的响应事件喔。&&&&&&&&&&&&//细心的朋友可以自己加上。&&&&&&&&&&&&UIButton *btn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];&&&&&&&&&&&&pin.rightCalloutAccessoryView=btn;&&&&}&&&&&pin.annotation = annotation;&&&&&return pin;&}&- (void)viewDidUnload{&&&&[super viewDidUnload];&&&&// Release any retained subviews of the main view.}&- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{&&&&return (interfaceOrientation == UIInterfaceOrientationPortrait);}&@end
最后是本文的源码下载:
雨松MOMO祝大家学习愉快、工作愉快、生活愉快、互相学习与进步,加油~
话说北京这会应该不下雨了吧??雨停了回家睡觉。 嚯嚯!
———————————-华丽的分割线——————————–
以上方法我在IOS6中使用发现了一点小问题,IOS6使用CLLocationManager定位的时候发现有时候定位到的经纬度是0.0000 所以地图界面中就是一个白屏。那么我将解决的办法贴出来。
//定位成功后将进入此方法- (void)locationManager:(CLLocationManager *)manager&&&&didUpdateToLocation:(CLLocation *)newLocation&&&&&&&&&& fromLocation:(CLLocation *)oldLocation{&&&&&&&&&myMapView.showsUserLocation =YES;&}
用这个方法来接受当前地图经纬度信息
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{&&&&&//更新地址,&&&&[_locManager stopUpdatingLocation];&&&&&//设置定位后的自定义图标。&&&&MKCircle* circle = [MKCircle circleWithCenterCoordinate:CLLocationCoordinate2DMake(myMapView.userLocation.location.coordinate.latitude, myMapView.userLocation.location.coordinate.longitude) radius:5000];&&&&&[myMapView addAnnotation:circle];&&&&&NSLog(@"%f",myMapView.userLocation.location.coordinate.latitude);&&&&&//我们需要通过当前用户的经纬度换成出它现在在地图中的地名&&&&CLGeocoder *geocoder = [[[CLGeocoder alloc] init] autorelease];&&&&[geocoder reverseGeocodeLocation: _locManager.location completionHandler:&&&& ^(NSArray *placemarks, NSError *error) {&&&&&&&&& //得到自己当前最近的地名&&&&&&&& CLPlacemark *placemark = [placemarks objectAtIndex:0];&&&&&&&&& NSString *locatedAt = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];&&&&&&&&& //locatedAt就是当前我所在的街道名称&&&&&&&& //上图中的中国北京市朝阳区慧中北路&&&&&&&& [myMapView.userLocation setTitle:locatedAt];&&&&&&&& [myMapView.userLocation setSubtitle:@"你在这里噢"];&&&&&&&&& nowLatitude = myMapView.userLocation.location.coordinate.latitude;&&&&&&&& nowLongitude = myMapView.userLocation.location.coordinate.longitude;&&&&&&&&& //这里是设置地图的缩放,如果不设置缩放地图就非常的尴尬,&&&&&&&& //只能光秃秃的显示中国的大地图,但是我们需要更加精确到当前所在的街道,&&&&&&&& //那么就需要设置地图的缩放。&&&&&&&& MKCoordinateRegion theRegion = { {0.0, 0.0 }, { 0.0, 0.0 } };&&&&&&&& theRegion.center= myMapView.userLocation.location.coordinate;&&&&&&&&& //theRegion.center.latitude = targetL&&&&&&&& //theRegion.center.longitude = argetL&&&&&&&&& //缩放的精度。数值越小约精准&&&&&&&& theRegion.span.longitudeDelta = 0.01f;&&&&&&&& theRegion.span.latitudeDelta = 0.01f;&&&&&&&& //让MapView显示缩放后的地图。&&&&&&&& [myMapView setRegion:theRegion animated:YES];&&&&&&&&& //最后让MapView整体显示, 因为截至到这里,我们已经拿到用户的经纬度,&&&&&&&& //并且已经换算出用户当前所在街道的名称。&&&&&&&& //myMapView.hidden =&&&& }];&}
本文固定链接:
转载请注明:
MOMO与MO嫂提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!

我要回帖

更多关于 appdelegate 的文章

 

随机推荐