假如我们新建一个基于view-based模板的工程,xcode会为我们生成一些文件,其中有三个文件是viewController.h,viewController.m,viewController.xib,我们可以在viewController.h声明一个消息响应函数如
-(IBAction)btnPressed:(id)sender;然后打开viewController.xib拖一个button按钮,然后链接刚才的消息响应函数;
然后我们在viewController.h中@interface之前条件协议的声明如下:
@protocal MyOwnProtocal
-(void)userPressButton:(NSObject *)param;
@end
@interface ...ViewController : UIViewController {
id< MyOwnProtocal > myOwnDelegate;
}
@property (nonatomic, assign) IBOutlet id< MyOwnProtocal > myOwnDelegate;
@end
在iewController.m文件中实现消息响应函数如下
@synthesize myOwnDelegate;
-(IBAction)btnPressed:(id)sender{
if(nil != myOwnDelegate){
[myOwnDelegate userPressButton:想传递的参数];
}
}
然后我们可以另外的类OtherClass声明文件中实现MyOwnProtocal协议,并声明一个viewController的成员变量,并在初始化函数中设置viewController.delegate = self,然后就能自定义协议中的方法
-(void)userPressButton:(NSObject *)param{
我们就能使用param参数得到我们想要的信息;
}
完毕;
为了加深理解可以想想UIWebView类的用法,假如在我们自己的类MyClass中声明一个UIWebView成员变量myWebView,我们可能是通过Interface Builder链接myWebView,我们也可以自己编码生成UIWebView实例;然后,我们一般会在MyClass声明时实现UIWebViewDelegate协议,如@interface MyClass<UIWebViewDelegate>{}@end;然后在MyClass的初始化函数中(比如:假如MyClass是一个ViewController的子类,我们可以在viewDidLoad函数中)指定myWebView的委托,如myWebView.delegate = self;
程序运行后,当网页准备加载,开始加载,发生错误,加载完毕,myWebView都会调用UIWebViewDelegate的成员方法,如shouldStartLoadWithRequest ,webViewDidStartLoad,didFailLoadWithError ,webViewDidFinishLoad,我们在MyClass中实现这些方法就能得知网页的加载情况;
我们在UIWebView.h文件可以看到下面的代码
@protocol UIWebViewDelegate <NSObject>
@optional
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
- (void)webViewDidStartLoad:(UIWebView *)webView;
- (void)webViewDidFinishLoad:(UIWebView *)webView;
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
@end
UIKIT_EXTERN_CLASS @interface UIWebView : UIView <NSCoding, UIScrollViewDelegate> {
@private
UIWebViewInternal *_internal;
}
很多细节被UIWebViewInternal隐藏了,我们可以想象UIWebView.h像下面这样:
@interface UIWebView : UIView <NSCoding, UIScrollViewDelegate> {
id<UIWebViewDelegate> delegate;
}
在UIWebView.m的实现文件中
当底层网络事件发生,如网页准备加载,开始加载,发生错误,加载完毕发生调用UIWebViewDelegate的成员方法,并传递相应的参数;
然后在我们的MyClass也就能得到这些事件了;
自定义协议或委托大体思路跟这个类似;