IOS开发Protocol协议及委托代理(Delegate)传值

Howcanicallme 分享 时间: 收藏本文

【简介】感谢网友“Howcanicallme”参与投稿,下面是小编整理的IOS开发Protocol协议及委托代理(Delegate)传值(共3篇),欢迎您阅读,希望对您有所帮助。

篇1:IOS开发Protocol协议及委托代理(Delegate)传值

前言:因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替,Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法。也就是说,它只告诉你要做什么,但具体怎么做,它不关心。

当一个类要使用某一个Protocol(协议)时,都必须要遵守协议。比如有些必要实现的方法,你没有去实现,那么编译器就会报警告,来提醒你没有遵守××协议。注意,我这里说的是警告,而不是错误。对的,就算你不实现那些“必要实现”的方法,程序也是能运行的,只不过多了些警告。

我会在本文的结尾放上此Demo的下载地址,有需要的话可以去下载,谢谢。

Protocol(协议)的作用:

一、定义一套公用的接口(Public)

@required:必须实现的方法

@optional:可选实现的方法(可以全部都不实现)

二、委托代理(Delegate)传值:

它本身是一个设计模式,它的意思是委托别人去做某事。

比如:两个类之间的传值,类A调用类B的方法,类B在执行过程中遇到问题通知类A,这时候我们需要用到代理(Delegate)。

又比如:控制器(Controller)与控制器(Controller)之间的传值,从C1跳转到C2,再从C2返回到C1时需要通知C1更新UI或者是做其它的事情,这时候我们就用到了代理(Delegate)传值。

一、定义一套公用的接口(Public)

ProtocolDelegate.h代码(协议不会生成.m文件):

#import

@protocol ProtocolDelegate

// 必须实现的方法

@required

- (void)error;

// 可选实现的方法

@optional

- (void)other;

- (void)other2;

- (void)other3;

@end

在需要使用到协议的类,import它的头文件:

#import “ViewController.h”

#import “ProtocolDelegate.h”

我这里选择的是入口文件

记得要遵守协议:

@interface ViewController

@end

这时会报一个警告,因为定义的协议里有一个是必须实现的方法,而我们没有去实现:

实现了必须实现的方法后,编译器就不会报警告了:

至于其它的可选方法,你可以选择实现,也可以全都不实现。

二、委托代理(Delegate)传值

下面放出主要类文件代码,我在里面写了注释,大家应该能看懂。不懂也没有关系,我会在本文结尾放上Demo下载地址。

ViewController.m文件:

#import “ViewController.h”

#import “ProtocolDelegate.h”

#import “ViewControllerB.h”

@interface ViewController ()

@end

@implementation ViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

{

ViewControllerB *vc = segue.destinationViewController;

[vc setDelegate:self];

}

// 这里实现B控制器的协议方法

- (void)sendValue:(NSString *)value

{

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@“成功” message:value delegate:nil cancelButtonTitle:@“确定” otherButtonTitles:nil, nil];

[alertView show];

}

- (void)error

{

}

@end

ViewControllerB.h文件:

#import

// 新建一个协议,协议的名字一般是由“类名+Delegate”

@protocol ViewControllerBDelegate

// 代理传值方法

- (void)sendValue:(NSString *)value;

@end

@interface ViewControllerB : UIViewController

// 委托代理人,代理一般需使用弱引用(weak)

@property (weak, nonatomic) id delegate;

@end

ViewControllerB.m文件:

#import “ViewControllerB.h”

@interface ViewControllerB ()

@property (strong, nonatomic) IBOutlet UITextField *textField;

@end

@implementation ViewControllerB

- (IBAction)backAction:(id)sender

{

if ([_delegate respondsToSelector:@selector(sendValue:)]) { // 如果协议响应了sendValue:方法

[_delegate sendValue:_textField.text]; // 通知执行协议方法

}

[self.navigationController popViewControllerAnimated:YES];

}

@end

小结:

当你需要定义一套公用的接口,实现方法可以是不同的时候,你可以使用Protocol协议,

当你需要进行类与类之间的传值时,你也可以基于Protocol协议,使用代理设计模式进行传值。

本文作者:GarveyCalvin

出处:www.cnblogs.com/GarveyCalvin/

篇2:iOS 用delegate方式实现页面之间的传值

斌子刚刚接触IOS今天做项目的时候,遇到一个问题,在跳页时需要进行传参数,

iOS 用delegate方式实现页面之间的传值

。上网找了许多方法,书上也没有找到很好的方法。所有功能都得自己慢慢摸索。最后找到了一个网友的帖子,现在用delegate的方式来实现,实际上delegate传值的实质就是:比如右AB两个页面,A想要传值给B ,就只要先在A中得到B的指针,然后将想要传的值赋给B,之后跳转,

话不多说直接上代码。

首先我们需要建一个delegate:

[plain]

@protocol PassValueDelegate

- (void)setValue:(NSString *)value;

@end

然后在A.h里面定义

[plain]

[plain]

@interface A:TTTableViewController{

id

passDelegate;

}

@property(nonatomic, retain) id

passDelegate;

在A.m里面

@synthesize passDelegate;

我的类不够直观,摘别人的文字把)

在跳转的时候:

[plain]

buttonClicked:(id) sender{

B *_b = [[B alloc] init];

self.passDelegate = _b; // 这里和B进行交互,下一句代码就是对应的赋值

[self.passDelegate setValue: NEED_PASS_VALUE];

在B.h里面

[plain]

@interface B : NSObject

{

NSString* _value;

}

- (void) setValue:(NSString *) value;

在B.m里面

[plain]

- (void) setValue:(NSString *) value{

_value = value;

}

实现了这些函数以后

你就在B中得到了A传来的值 也就是_value这个变量

篇3:iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)

使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值:

先说一下思想:

首先,创建两个视图控制器,在第一个视图控制器中创建一个UILabel和一个UIButton,其中UILabel是为了显示第二个视图控制器传过来的字符串,UIButton是为了push到第二个界面,

第二个界面的只有一个UITextField,是为了输入文字,当输入文字,并且返回第一个界面的时候,当第二个视图将要消失的时候,就将第二个界面上TextFiled中的文字传给第一个界面,并且显示在UILabel上。

其实核心代码就几行代码:

下面是主要代码:(因为我是用storyBoard创建的工程,所以上面的属性和相应的方法,是使用系统生成的outlet)

一、在第二个视图控制器的.h文件中定义声明Block属性

typedef void (^ReturnTextBlock)(NSString *showText);@interface TextFieldViewController : UIViewController@property (nonatomic, copy) ReturnTextBlock returnTextBlock;- (void)returnText:(ReturnTextBlock)block;@end

第一行代码是为要声明的Block重新定义了一个名字

ReturnTextBlock

这样,下面在使用的时候就会很方便。

第三行是定义的一个Block属性

第四行是一个在第一个界面传进来一个Block语句块的函数,不用也可以,不过加上会减少代码的书写量

二、实现第二个视图控制器的方法

- (void)returnText:(ReturnTextBlock)block { self.returnTextBlock = block;}- (void)viewWillDisappear:(BOOL)animated { if (self.returnTextBlock != nil) { self.returnTextBlock(self.inputTF.text); }}

其中inputTF是视图中的UITextField,

第一个方法就是定义的那个方法,把传进来的Block语句块保存到本类的实例变量returnTextBlock(.h中定义的属性)中,然后寻找一个时机调用,而这个时机就是上面说到的,当视图将要消失的时候,需要重写:

- (void)viewWillDisappear:(BOOL)animated;

方法。

三、在第一个视图中获得第二个视图控制器,并且用第二个视图控制器来调用定义的属性

如下方法中书写:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. TextFieldViewController *tfVC = segue.destinationViewController; [tfVC returnText:^(NSString *showText) { self.showLabel.text = showText; }];}

相关专题 委托代理协议