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协议的使用,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。