你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> IOS開發之——Protocol協議的使用

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

編輯:IOS開發綜合
 
一、說明
兩個類進行通訊,用協議就比較方便。

1.協議聲明了可以被任何類實現的方法
2.協議不是類,它是定義了一個其他對象可以實現的接口
3.如果在某個類中實現了協議中的某個方法,也就是這個類實現了那個協議。
4.協議經常用來實現委托對象。一個委托對象是一種用來協同或者代表其他對象的特殊對象。
5:委托,就是調用自己定義方法,別的類來實現。
6.新特性說明
@optional預編譯指令:表示可以選擇實現的方法
@required預編譯指令:表示必須強制實現的方法


二、定義
.h
@protocol ContactCtrlDelegate 
-(void)DismissContactsCtrl; 
@end 


@interface ContactsCtrl : UIViewController { 
    id  delegate; 
} 
@property (nonatomic, assign) id  delegate; 
.m
@synthesize delegate; 

三、例子

例如:UITextView

@protocol UITextViewDelegate  
@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  

//定義協議 
@protocol ContactCtrlDelegate 
-(void)DismissContactsCtrl; 
@end 

@interface ContactsCtrl : UIViewController { 
    IBOutlet UINavigationBar *ContactNavBar; 
    id  delegate; 
} 
@property (nonatomic, assign) id  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  
#import ContactsCtrl.h 
@interface ProtocolDemoCtrl : UIViewController {//添加委托 
    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的屬性和方法了。

 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved