自定义协议或实现委托

假如我们新建一个基于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也就能得到这些事件了;

 

自定义协议或委托大体思路跟这个类似;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值