IOS開發之——Protocol協議的使用

來源:互聯網
上載者:User

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


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.