標籤: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的屬性和方法了。