`

Protocol协议的用法

 
阅读更多

一、说明
两个类进行通讯,用协议就比较方便。

(书本上的东东,还是得看看)
1.协议声明了可以被任何类实现的方法
2.协议不是类,它是定义了一个其他对象可以实现的接口
3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
4.协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
5:委托,就是调用自己定义方法,别的类来实现。
6.新特性说明
@optional预编译指令:表示可以选择实现的方法
@required预编译指令:表示必须强制实现的方法


二、定义

.h
@protocol ContactCtrlDelegate
-(void)DismissContactsCtrl;
@end

@interface ContactsCtrl : UIViewController {
    id <ContactCtrlDelegate> delegate;
}
@property (nonatomic, assign) id <ContactCtrlDelegate> delegate;


.m
@synthesize delegate;


三、例子

例如:UITextView
@protocol UITextViewDelegate <NSObject>

@optional

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView;
- (BOOL)textViewShouldEndEditing:(UITextView *)textView;

- (void)textViewDidBeginEditing:(UITextView *)textView;
- (void)textViewDidEndEditing:(UITextView *)textView;

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;
- (void)textViewDidChange:(UITextView *)textView;

- (void)textViewDidChangeSelection:(UITextView *)textView;

@end

如果要调用以上这些方法,就必须设置UITextView的委托:TextView.delegate = self;


四、Demo

1、ContactsCtrl.h

#import <UIKit/UIKit.h>

//定义协议
@protocol ContactCtrlDelegate
-(void)DismissContactsCtrl;
@end

@interface ContactsCtrl : UIViewController {
    IBOutlet UINavigationBar *ContactNavBar;
    id <ContactCtrlDelegate> delegate;
}
@property (nonatomic, assign) id <ContactCtrlDelegate> delegate;


-(IBAction)canCelBtn:(id)sender;
@end


2、ContactsCtrl.m

@implementation ContactsCtrl
@synthesize delegate;

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    ContactNavBar.topItem.prompt = @"选取联系人发送短信";
}


//调用协议中的方法
-(IBAction)canCelBtn:(id)sender{
    [delegate DismissContactsCtrl];
}


3、ProtocolDemoCtrl.h

#import <UIKit/UIKit.h>
#import "ContactsCtrl.h"
@interface ProtocolDemoCtrl : UIViewController <ContactCtrlDelegate>{//添加委托
    ContactsCtrl *contactsView;
}


4、ProtocolDemoCtrl.m

#import "ProtocolDemoCtrl.h"
#define BARBUTTONADD(SELECTOR) [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:SELECTOR] autorelease];

@implementation ProtocolDemoCtrl
@synthesize contactsView;

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.rightBarButtonItem = BARBUTTONADD(@selector(addContactAction:));
}


- (void)addContactAction:(id)sender{
    ContactsCtrl *contactView = [[ContactsCtrl alloc] initWithNibName:@"ContactsCtrl" bundle:nil];
    self.contactsView = contactView;
    contactsView.delegate = self;//设置委托
    [self presentModalViewController:contactsView animated:YES];
    [contactView release];    
}


//实现ContactCtrlDelegate协议中的方法
-(void)DismissContactsCtrl{
    [contactsView dismissModalViewControllerAnimated:YES];
}

分享到:
评论

相关推荐

    iOS之协议protocol

    用代码清晰的解释了协议的用法与使用场景,以及各个类之间用协议protocol通信的规则。欢迎来学习,同时希望提出意见共同进步

    协议与委托 (Protocol and Delegate) 实例解析demo

    正式协议是通过protocol指定的一系列方法的声明,然后由实现该协议的类自己去实现这些方法。而非正式协议是通过向NSObject中添加一个类别来实现,然后子类去继承NSObject。其实都差不多。 不过,非正式协议已经渐渐...

    DHCP协议详解Dynamic Host Configuration Protocol

    常见的小型网络中(例如家庭网络和学生宿舍网),网络管理员都是采用手工分配IP地址的方法,而到了中、大型网络,这种方法就不太适用了。在中、大型网络,特别是大型网络中,往往有超过100台的客户机,手动分配IP...

    Protocol Buffers协议编码规则

    它是以Base 128 Varints编码基础, varints是一种将一个整数序列化为一个或者多个Bytes的方法,越小的整数,使用的Bytes越少。 基本规则 1.每个Byte的最高位(msb)是标志位,如果该位为1,表示该Byte后面还有其它Byte...

    ARP(Address Resolution Protocol)协议实现原理

    ARP是Address Resolution Protocol的缩写。中文译做“地址解析协议”,本质是完成网络地址到物理地址的映射。从概念上讲就是找到一个映射方法f,使得“物理地址 = f(网络地址)”。物理地址有两种基本类型:以太网...

    RFC1945 Hyptertext Transfer Protocol 超文本传输协议– HTTP1.0

    它是一个一般的、无状态的、基于对象的协议,通过对其请求方法(request methods)进行扩展,可以被用于多种用途,比如命名服务器(name server)及分布式对象管理系统。HTTP的一个特性是其数据表现类型允许系统的...

    lifx-protocol-docs, LIFX局域网协议V2文档.zip

    lifx-protocol-docs, LIFX局域网协议V2文档 LIFX开发人员主页 | LAN协议。 LiFi实验室,© 2015. 保留所有权利。这里文档的用法由 [LIFX Developer Terms] ( http://developer.lifx.com/terms.html ) 绑定。

    一个关于symbian http协议用法的实例代码

    一个关于symbian http协议用法的实例代码-Symbian http protocol on the use of code examples.zip

    protocol-registry:此模块允许您为 nodejs 应用程序设置自定义协议处理程序

    这意味着在命令行工具和脚本中使用,而不是在浏览器中使用。 为什么? 积极维护。 处理跨平台。 支持 Windows 应用程序的 WSL 路径。 处理多行命令 安装 $ npm install protocol-registry 用法 const path = ...

    bittorrent-protocol:简单,可靠,BitTorrent对等有线协议实现

    安装npm install bittorrent-protocol用法该协议被实现为双工流,因此您要做的就是通过管道与之进行双向通信。 双工流烟斗(b)。烟斗(a) (来自图像按子堆栈进行讨论。) const Protocol = require ( 'bittorrent...

    OpenControlProtocol:用于远程控制设备的开放协议

    开放控制协议OCP 是一种简单而快速的协议,用于通过任何支持文本的方法(例如串行)控制设备。 基于简单文本的标准无需连接初始化极轻易于实施版本没有正式版我们目前正在努力形成一个完整的格式,我们仍在提出新的...

    redis_protocol:python实现的Redis协议

    用法 这是按照实现的。 我在我的项目中使用过它。 &gt;&gt;&gt; from redis_protocol import decode, encode &gt;&gt;&gt; encode("ping") # encode a request ... '*1\r\n$4\r\nping\r\n' &gt;&gt;&gt; decode('*1\r\n$4\r\nping\r\n') # ...

    RFC1134_+PPP协议:关于在点到点链路上进行多协议包传送的建议 .doc

    PPP 也定义了可扩展的链路控制协议(Link Control Protocol),它(Link Control Protocol)使用验证协议磋商在链路上传输网络层协议前验证链路的对端。 这个文档定义了两种验证协议:密码验证协议(the Password ...

    kafka_protocol:Kafka协议Erlang库

    用于Erlang / Elixir的Kafka协议库 该库提供: 基本的Kafka连接管理API Kafka协议线路格式编码/解码功能 ...有两种方法可以将这种动态依赖项注入kakfa_protocol : 设置应用环境 例如{provide_compression, [{lz4, my

    计算机网络基础课程—文件传输协议(File-Transfer-Protocol).doc

    计算机网络基础课程—文件传输协议(File Transfer Protocol) 文件传输协议(FTP) (RFC 959)是TCP/I中最常见的应用。标准的文件传输协议在ARPANET 时期就开始工作,逐渐发展到现在的FTP。 由FTP提供的文件传输功能...

    Quick.Protocol:TCP的简单协议

    使用Quick.Protocol的最简单方法是通过Quick.Protocol NuGet包。 QP / TCP QP /串行端口QP /管道QP / WebSocket结构 数字采用大端字节序 包长度包含4个字节的包长度数据。 命令编号为16字节GUID 0-&gt;心跳数据包结构...

    Swift中的协议(protocol)学习教程

    Swift中的协议使用protocol关键字来声明。Swift中的协议还有一个十分有意思的特性,协议可以通过扩展来实现一些方法和附加功能。 二、在协议中定义属性和方法 协议中定义的属性只约定名称和类型,在具体类型的实现中...

    ant message protocol and usage

    这片文档定义ANT+低功耗通信协议的协议消息定义和使用方法,是thisisant的官方文档。

    libsignal-protocol-[removed]JavaScript的信号协议库

    该协议使用称为“ PreKeys”的概念。 PreKey是由服务器存储在一起的ECPublicKey和关联的唯一ID。 PreKeys也可以签名。 在安装时,客户端会生成单个已签名的PreKey以及大量未签名的PreKey,并将它们全部传输

    language_server-protocol-ruby:用于Ruby的语言服务器协议SDK

    用法 目前,此gem仅支持stdio作为开箱即用的传输层。 require "language_server-protocol" LSP = LanguageServer :: Protocol writer = LSP :: Transport :: Stdio :: Writer . new reader = LSP :: Transport :: ...

Global site tag (gtag.js) - Google Analytics