? IOS 委托和协议区别和联系 (=)

IOS 委托和协议区别和联系 (=)

上一片大致说了一下IOS上面委托和协议的区别和联系,并且举了一个简单的例子,但是例子比较简单,今天做一个用委托模拟button回调的例子。

在一个自定义View上面放一个登陆按钮,并且这个LoginView里面有一个实现ILogin的委托对象,在登陆按钮的点击事件中调用需要实现的协议函数。在一个ViewController中实现ILgin协议,并实现login方法。将自定义LoginView放到ViewController中,这时候点击button按钮,回自动调用login方法;这时候在ViewController中并没有看到直接调用login方法的地方,好像系统的回调一样。

代码实现:

ILogin.h

?


1

2

3

4

5

6

7

8

9

10


#import <Foundation/Foundation.h>

@protocol ILogin <NSObject>

@required

- (
void
)login;

@optional

@end

自定义View LoginView

?


1

2

3

4

5

6

7


#import <UIKit/UIKit.h>

#import "ILogin.h"

@interface LoginView : UIView

@property (nonatomic)id<ILogin> delegate;

@end

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34


#import "LoginView.h"

@implementation LoginView

- (id)initWithFrame:(CGRect)frame

{

    
self = [super initWithFrame:frame];

    
if
(self) {

        
// Initialization code

        

        
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];

        
[button setFrame:CGRectMake(30, 60, 150, 45)];

        
[button setTitle:@
"LoginView登陆"
forState:UIControlStateNormal];

        
[button addTarget:self action:@selector(submitClick) forControlEvents:UIControlEventTouchUpInside];

        
[self addSubview:button];

    
}

    
return
self;

}

/*

// Only override drawRect: if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

- (void)drawRect:(CGRect)rect

{

    
// Drawing code

}

*/

- (
void
)submitClick{

    
//这里注意,调用实现协议的类的login方法

    
[self.delegate login];

}

@end

ViewController

?


1

2

3

4

5

6


#import <UIKit/UIKit.h>

#import "ILogin.h"

@interface ViewController : UIViewController<ILogin>

@end

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30


#import "ViewController.h"

#import "LoginView.h"

@interface ViewController ()

@end

@implementation ViewController

- (
void
)viewDidLoad

{

    
[super viewDidLoad];

    
// Do any additional setup after loading the view, typically from a nib.

   
LoginView *loginView=[[LoginView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 300)];

    
loginView.delegate=self;

    
[self.view addSubview:loginView];

}

- (
void
)didReceiveMemoryWarning

{

    
[super didReceiveMemoryWarning];

    
// Dispose of any resources that can be recreated.

}

#pragma mark - ILogin 协议实现

- (
void
)login{

    
NSLog(@
"实现协议函数调用!"
);

}

@end

点击button调用结果:  2013-08-08 19:49:43.974 DelegateDemo[2205:c07] 实现协议函数调用!

现在你看到的现象好像是系统自动回调,但这是利用button按钮的系统回调在出现的,正常情况下我们一般是通过在实现协议的对象(ViewController)中声明委托人(LoginView)的对象,然后直接调用委托人的方法来实现回调,(注:委托人的方法中包含需要实现的协议方法)。这种方式应该是在IOS开发中经常用到的委托和协议组合。

时间: 2024-10-14 16:10:16

? IOS 委托和协议区别和联系 (=)的相关文章

iOS委托传值

iOS委托传值方式在开发中占很重要的地位,可能对于初学者来说一时很难弄明白 博主也是通过不断的找资料,在开发中慢慢学会的! 首先我们假设有A,B两个控制器,A控制器中有一个textField和一个button,B控制器中有一个label 当我们点击A中的button时就得将textField里面的文本值传入到B中的label上显示 在A.h中我们做写入如下代码: 在A.m中的按钮点击事件中我们写入如下代码: 在B.h中导入A.h文件并遵循PassValueDelegate 协议然后实现协议中的方

iOS之代理/协议 @protocal

理解: @protocal 可以定义一个协议.一个类如果使用了这个协议,那么就要按照这个协议要求的去办事.最常见的就是UITableViewDelegate.UITableViewDataSource这个两个家伙.我们的类可以使用这两个协议,并对协议定义的方法进行实现(numberOfRowsInSection, heightForRowAtIndexPath...),然后需要绑定.因为我们的类已经实现了这个这两个协议.所以我们类中的tableview可以这样绑定: tableview.dele

详解Objective-C中委托和协议

Objective-C委托和协议本没有任何关系,协议如前所述,就是起到C++中纯虚类的作用,对于“委托”则和协议没有关系,只是我们经常利用协议还实现委托的机制,其实不用协议也完全可以实现委托. AD:[活动]Web和APP兼容性实战 Win10训练营免费报名 Objective-C中委托和协议是本文要介绍的内容,委托和协议是两个概念,协议实际上相当于C++中的纯虚类的概念,只定义并只能由其它类来实现.而委托类似于Java中的接口.(Objective-C实现委托这种机制是利用协议来实现的,这种说

委托与协议

Delegate-委托,顾名思义就是委托别人办事,就是当一件事情发生后,自己不处理,让别人来处理. Protocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现. 委托(Delegate)是面向对象的回调方法,委托提供了一个单一的对象来接收所有的事件消息.委托对象可以存储.操作.响应.转播相关的消息等等. 协议(Protocol)- 每一个对象的都可以有委托,并且有响应的协议(Protocol)定义对象可以向委托发送的消息.委托实现了协议中感兴趣的事件方法.

蛋疼的Apple IOS Push通知协议

简介 Apple Push通知机制其实很简单,就是Apple的APNs服务器做为中间人,把消息推送到对应的设备上. 一张来自Apple文档的图: 当然,示意图看起来简单,但是还有一些实际的问题. 比如,如何区分Provicer的?如何区分设备的? 简单而言,是这样的: 每个应用都有一个自己的证书(certificate),开发者可以从苹果那里获得: 应用可以到APNs服务器上注册(register),然后得到一个device_token,开发者要自己保存好,推送时就要用这个来区分不同的设备. 注

app测试教程:ios与android的区别

App测试中ios和Android的区别: 1.Android系统(http://www.maiziedu.com/course/android-px/)手机长按home键呼出应用列表和切换应用,然后右滑则终止应用: 2.多分辨率测试,Android端20多种,ios较少: 3.手机操作系统,Android较多,ios较少且不能降级,只能单向升级:新的ios系统中的资源库不能完全兼容低版本中的ios系统中的应用,低版本ios系统中的应用调用了新的资源库,会直接导致闪退(Crash): 4.操作习

【转载】App测试中ios和Android的区别:

App测试中ios和Android的区别: 1.        Android长按home键呼出应用列表和切换应用,然后右滑则终止应用: 2.        多分辨率测试,Android端20多种,ios较少: 3.        手机操作系统,Android较多,ios较少且不能降级,只能单向升级:新的ios系统中的资源库不能完全兼容低版本中的ios系统中的应用,低版本ios系统中的应用调用了新的资源库,会直接导致闪退(Crash): 4.        操作习惯:Android,Back键是

IOS 多线程与异步的区别

转:http://wenku.baidu.com/link?url=qJDMdA-KjlkTlEXKGqH6BJ-SNQn7ix2szY31kWXV8dtN98kJMHt0OxuE4Wz5d46zcCOsVIuTIDmLEmnfKuw2iC9el9Z4kXFKEJIeCZAiyDS IOS 多线程与异步的区别

IOS与安卓的区别

1.软件工程,一个项目的流程是--? 简单的说就是:需求确认--概要设计--详细设计--编码--单元测试--集成测试--系统测试--维护  需求确认:需求规格说明书  概要设计:系统用例图,用例场景  详细设计:系统设计报告,数据库设计报告  测试:测试用例报告 2.软件测试流程? 测试准备-测试计划-测试需求-测试用例-测试执行-测试缺陷管理-测试报告总结 注:需求分析需求分析(Requirment Analyzing)应该说是软件测试的一个重要环节,测试开发人员对这一环节的理解程度如何将直接