iOS 彻底学会使用delegate

原文:http://blog.csdn.net/dqjyong/article/details/7685898

委托delegation的介绍:

委托delegation是一种简单但是功能强大的设计模式,它的功能是程序中一个对象代表另一个对象,或者一个对象与另外一个对象协同工作。委托对象保留了另外一个对象的引用,即就是委托,以及在合适的时候发送消息给委托。消息通知事件的委托方法,委托对象将要处理或已经处理。委托可能通过更新本身或者本应用的其他对象的状态或者外观来对消息进行响应,在某些情况下委托也可能返回值,从而影响即将发生事件的处理方式。委托模式的主要价值是让你通过一个中心对象,简单的自定义某些对象的行为。

委托与Cocoa 平台

委托对象是典型的一种平台对象,而且委托是典型的一种自定义的控制器对象。在一个通过管理的内存环境中,委托对象保留了它的委托的弱引用,而在垃圾回收的环境中,接收者即委托对象保留它的委托的强引用。委托delegation的例子广泛存在于Foundation, UIKit, AppKit, 以及其他的r Cocoa 和 Cocoa Touch平台上。

以AppKit平台上NSWindow类的实例来作为委托对象为例。NSWindow类声明了协议,协议包含了windowShouldClose:方法。当用户点击了窗体的关闭按钮,那么窗体对象就发送windowShouldClose:给它的委托,并请求委托来关闭窗体。委托将返回一个布尔值,用来控制窗体对象的行为。

下面讲一下在ios 中如何使用delegate

首先,声明delegate。例如:

//返回用户输入的委托

@protocol EnterDelegate  <NSObject>

@required//这个可以是required,也可以是optional

-(void)Entered:(NSInteger)amount;

@end

在委托的声明中,我们只定义了一个方法,它将给rootViewController返回从用户输入获得的一个NSInteger对象。

其次,在rootViewController中定义一个委托对象。如下代码:

@interface EnterViewController : UIViewController {
    
    IBOutlet UITextField *InputTextField;
    
    id < EnterDelegate > delegate;
    
}
-(IBAction)cancel
-(IBAction)save;
@property(nonatomic,assign)id delegate;
@end

上面的代码中“id < EnterDelegate > delegate”声明了id对象,并指向已经定义的delegate的引用。那么我们需要为该id对象添加一些属性,从而让EnterViewController能够访问它。

接下来实现委托方法。因为delegate Entered:方法是必须的,所以需要实现该方法。

-(void)Entered:(NSInteger)amount
{
    InputLabel.text = [NSString stringWithFormat:@"%i" , amount];
}

 

最后,完成委托对象给委托发送消息。即在EnterViewController的实现文件.m中完成上面定义的一些方法

-(IBAction)savePressed
{
    //确定委托是否存在Entered方法
    if([delegate respondsToSelector:@selector(Entered:)])
    {
        //发送委托方法,方法的参数为用户的输入
        [delegate Entered:[InputTextField.text intValue]];
    }
    
    [self dismissModalViewControllerAnimated:YES];
}

savePressed方法与工具栏中的保存按钮相联系。当用户完成了数字输入以及点击了保存,即触发该方法。

====================================================

上面的过程就是如何使用委托的过程,虽然功能是很简单的。

从委托方法的实现来看,委托方法的实现是在另外一个类中完成,即委托类的内部暴露了,与我们一般坚持的隐藏实现原则相违背。

从委托类的定义可以看出,委托与协议有一定的相似性。都采用protocol关键字来声明

,并且其中的方法都有optional和required,都需要对required方法和调用的optional方法进行实现。而不同的是在委托对象所在的类中需要定义一个delegate对象,并且为id类型。

但是delegate与protocol没有关系。Delegate本身应该称为一种设计模式,是把一个类自己需要做的一部分事情,让另一个类(也可以就是自己本身)来完成,而实际做事的类为delegate。而protocol是一种语法,它的主要目标是提供接口给遵守协议的类使用,而这种方式提供了一个很方便的、实现delegate模式的机会

时间: 2024-10-12 15:39:52

iOS 彻底学会使用delegate的相关文章

SKProductsRequest ios 7不调用delegate

在iOS7中,内购只能在真机上才会调用 - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response协议方法 若是用模拟器,它回调用 - (void)request:(SKRequest *)request didFailWithError:(NSError *)error { DLog(@"error ====== %@", error);

iOS中NSNotification、delegate、KVO三者之间的区别与联系?

iOS中NSNotification.delegate.KVO三者之间的区别与联系? delegate.notification和KVO他们的功能比较类似,那么在实际的编程中,如何选择这些方式呢? 在开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信: 1.委托delegation: 2.通知中心Notification Center: 3.键值观察key value observing,K

iOS中jQuery 的delegate 事件监听无效解决办法

前端的小朋友将原来 以下结构的代码 <a href="ssss"> <p>sssss</p> <p>dddddd</p> </a> 改成了 <div data-href="ssss"> <p>ssssss</p> <p>dddddd</p> </div> 因为涉及到一些异步加载的内容,所以使用如下代码来实现 a 标签的功能

iOS中如何选择delegate、通知、KVO(以及三者的区别)

转载自:http://blog.csdn.net/dqjyong/article/details/7685933 在开发IOS应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers[B]怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信:1委托delegation2通知中心Notification Center3键值观察key value observing,KVO因此,那为什么我们需要这些模式以及什么时候用它以及什么时候不用它.    下面完全根据我的开

iOS设计模式——委托(delegate)

委托(delegate)也叫代理是iOS开发中常用的设计模式.我们借助于protocol(参考博文:objective-c协议(protocol))可以很方便的实现这种设计模式. 什么是代理? 苹果的官方文档给了很清晰的解释: Delegation is a simple and powerful pattern in which one object in a program acts on behalf of, or in coordination with, another object.

iOS视图控制器之间delegate传值教程

之前在StackOverFlow上看到一篇讲传值(segue传值和delegate传值)的文章,感觉讲的很清晰,就将delegate部分翻译了一下,有兴趣可以看看. 原文: http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers 译文: 为了从ViewControllerB往回传值到ViewControllerA,我们需要使用协议(Protocols)和代理(Delegates). 为了实现

iOS 【UIKit-UIPageControl利用delegate定位圆点位置 之 四舍五入小技巧】

在UIScrollView中会加入UIPageControl作为页码标识,能够让用户清楚的知道当前的页数.我们须要优化的一点是让pageControl的小圆点精确的跟着scrollView而定位.我们先来看一下效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="381"

iOS中 学会如何对sqlite3 进行封装 (纯手工)

#waring ---(看官注意) ---使用说明: ①在创建自定义model类之前让该类继承自文件中的Model类, ②为model类选一个NSString属性作为主键:(既,在初始化方法里面将从父类Model类 ID属性等于你所选的NSString属性值即可 (具体可参见.下文  二.3 中) 一.文件夹结构: 二.文件说明: 1.NSObject+NSCoding 该文件是对对象类型进行encoding 以及 decoding操作的方法 2.DataHandle 1. 该文件是 sqlit

从零开始学ios开发(七):Delegate,Action Sheet, Alert

Action Sheet和Alert是2种特殊的控件(暂且称之为控件吧,其实不是控件真正的控件,而是ios中的2个类,这2个类定义了2种不同类型的用于和用户交互的弹出框),Action Sheet是从底部弹出,上面有2个或者2个以上的选项供用户选择,Alert就是一个警告框,上面有1个或者1个以上的按钮供用户进行选择. 在继续这一篇的内容之前,稍微花点时间说一下ios中用到的Delegate Pattern(委托\代理模式). ios中有很多已经定义好的类可以供我们在编写程序时直接使用,例如UI