IOS开发之——Protocol协议的使用

protocol
[‘pr?ut?k?l] (例子:http://blog.sina.com.cn/s/blog_6aafe9c90100yozz.html )

一、说明

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

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];
} 

综上,如果A类.h文件定义了一个协议,在A类里面我们还需要定义一个委托delegate,协议里面有个必须实现的methodA方法(@required,这个方法在实现了协议的类里面实现),在A类的.m文件中需要调用这个methodA方法,我们使用委托调用这个methodA方法

[delegate DismissContactsCtrl]; 

类B实现了这个协议,在.h文件中定义类A的对象a,在.m文件中需要实现methodA方法,并且需要设置委托

a.delegate = self;//设置委托

如果MethodA返回的是B类的对象,那么在A类中就可以调用B类属性和方法,B类中也可以调用A的属性和方法了。

IOS开发之——Protocol协议的使用

时间: 2024-12-10 17:28:09

IOS开发之——Protocol协议的使用的相关文章

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

前言:因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替.Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法.也就是说,它只告诉你要做什么,但具体怎么做,它不关心. 当 一个类要使用某一个Protocol(协议)时,都必须要遵守协议.比如有些必要实现的方法,你没有去实现,那么编译器就会报警告,来提醒你没有遵守×× 协议.注意,我这里说的是警告,而不是错误.对的,就算你不实现那些“必要实现”的方法,程序也是能运行的,只不过多了些警告. 我会

小白学开发(iOS)OC_ protocol(协议) (2015-08-09)

// //  main.m //  protocol(协议) // //  Created by admin on 15/8/12. //  Copyright (c) 2015年 admin. All rights reserved. // #import <Foundation/Foundation.h> #import "Person.h" #import "Student.h" /* 1. 什么是协议: >  协议实际上是一种向上抽象的思想

聊聊 iOS 开发中的协议

前言 何为协议,简单来说在OC中我们使用关键字@protocol可以声明一个协议,并在协议中添加多个属性.方法供于遵循者实现,从某个角度上来说,这是一种不同于category机制的category.在日常开发中,协议可谓无处不在,最为核心的UITableView通过协议来获取数据.完成事件处理等.下面就是一个最粗浅的协议 @protocol CustomProtocol - (void)doSomething; @end 对于协议的理解,很多的开发者依旧保留在委托-代理等于协议等认知上.然而前者

ios开发之代理&amp;&amp;协议(补充篇)

一.理解协议与代理 协议: 协议是一个方法签名的列表,在其中可以定义若干个方法.根据配置,遵守该协议的类会去实现这个协议中规定的若干个方法. 代理: 代理是一个概念,很难用一个名词去定义(如我们可以说协议其实就是一个方法列表).它更像是一种关系,我要做某一个事情,但我自己不想去做这件事,我委托其他人帮我去做这件事.这个时候,这位其他人就是我的代理. 二.协议的使用 在定义协议时,可以通过@required与@optional来配置遵守这个协议必须去实现的方法和可以选择的方法.譬如: @proto

swift开发之--Protocol(协议)

使用object-c语言的同学们肯定对协议都不陌生,但在swift中苹果将protocol这种语法发扬的更加深入和彻底. Swift中的protocol不仅能定义方法还能定义属性,配合extension扩展的使用还能提供一些方法的默认实现,而且不仅类可以遵循协议,现在的枚举和结构体也能遵循协议了. 基于此本文从 : 1,协议中定义属性和方法, 2,协议的继承.聚合.关联类型, 3,协议的扩展, 4,Swift标准库中常见的协议, 5,为什么要使用协议 5个方面结合自身的学习经验简单介绍一下这种"

iOS开发——OC篇&amp;协议篇/NSCoder/NSCoding/NSCoping

协议篇/NSCoder/NSCoding/NSCoping 协议声明类需要实现的的方法,为不同的类提供公用方法,一个类可以有多个协议,但只能有一个父类,即单继承.它类似java中的接口. 正式协议(formal protocol)------------------------------------------------------------------------------------声明正式协议使用@protocol指令,以@end结尾. @protocol MyXMLSupport

iOS开发之让你的应用“动”起来

在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画组.转场动画,如何通过UIView的装饰方法对这些动画操作进行简化等.在今天的文章里您可以看到动画操作在iOS中是如何简单和高效,很多原来想做但是苦于没有思路的动画在iOS中将变得越发简单: CALayer CALayer简介 在介绍动画操作之前我们必须先来了解一个动画中常用的对象CALayer.C

iOS开发OC基础:OC中的协议

1.协议是一种为有源代码的类扩充方法的方式. 2.协议只是一系列方法的生命,就相当于一张任务清单,规定了要做的事情,但是具有的实施(也就是实现),是由服从该协议的类来实现.所以协议只有.h文件,并且不可以定义变量 3.协议的定义是以@protocol开头, + 协议的名字 <>(表示服从的协议)服从的协议写在<>之内,多个协议之间通过逗号来进行分隔,父协议中的内容就相当于子协议也具有这些内容,以@end结束. 下面的附件是协议的一个小例子,可以加深大家对协议的理解,看完之后一定要多

【iOS开发-26】利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值

实验说明 (1)正向传值:比如A类里地值要传给B类用,就是我们先在A类中声明一个B类对象(当然B类头文件要import过来),然后把A类中得某个值传递给B类中得某个值(所以需要在B类中先准备一个变量来接受,就是用@property和@synthesize整个变量即可). (2)反向传值:比如需要把B类中的值传递给A类用.我们先在B类中写一个协议,协议里面有一个可以带参数的方法,这个参数就是我们要传递的值(这个协议也可以单独写,不一定写在B类中),然后B类遵循这个协议后,利用这个协议创建一个委托变