济南地区做公司网站的公司,什么网站可以做项目,建设com网站,天凡建设股份有限公司网站前言#xff1a;因为Object#xff0d;C是不支持多继承的#xff0c;所以很多时候都是用Protocol#xff08;协议#xff09;来代替。Protocol#xff08;协议#xff09;只能定义公用的一套接口#xff0c;但不能提供具体的实现方法。也就是说#xff0c;它只告诉你要… 前言因为ObjectC是不支持多继承的所以很多时候都是用Protocol协议来代替。Protocol协议只能定义公用的一套接口但不能提供具体的实现方法。也就是说它只告诉你要做什么但具体怎么做它不关心。 当 一个类要使用某一个Protocol协议时都必须要遵守协议。比如有些必要实现的方法你没有去实现那么编译器就会报警告来提醒你没有遵守×× 协议。注意我这里说的是警告而不是错误。对的就算你不实现那些“必要实现”的方法程序也是能运行的只不过多了些警告。 我会在本文的结尾放上此Demo的下载地址有需要的话可以去下载谢谢。 Protocol协议的作用 1. 定义一套公用的接口Public required必须实现的方法 optional可选 实现的方法可以全部都不实现 2. 委托代理Delegate传值 它本身是一个设计模式它的意思是委托别人去做某事。 比如两个类之间的传值类A调用类B的方法类B在执行过程中遇到问题通知类A这时候我们需要用到代理Delegate。 又比如控制器Controller与控制器Controller之间的传值从C1跳转到C2再从C2返回到C1时需要通知C1更新UI或者是做其它的事情这时候我们就用到了代理Delegate传值。 一、定义一套公用的接口Public 首先新建一个协议文件 填上协议文件名及文件类型选择Protocol 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传值 在Storyboard上先搭好界面如下图 新建ControllerB 把B界面的类设置为ViewControllerB 下面放出主要类文件代码我在里面写了注释大家应该能看懂。不懂也没有关系我会在本文结尾放上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;endinterface 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协议使用代理设计模式进行传值。 Demo测试通过环境 开发工具Xcode6.1 测试机型模拟器 测试系统IOS8.0 Demo下载地址 GCProtocolDelegate 转载于:https://www.cnblogs.com/Free-Thinker/p/4973155.html