IOS开发Protocol协议及委托代理(Delegate)传值
【简介】感谢网友“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
@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; }];}