代理中的方法有两种类型,一种是 @optional , 另一种是 @required 。前者是当某个类实现 这个代理的时候,可以选择不实现这个方法,后面则是必然要实现的方法。
这里关于代理还有一个很重要的点。因为代理的方法有可选和必选之分,例如当我们将前进的方法设定为必选并实现了,但是把后退的方法设置为了可选并且没有实现。这时当我们点击后退按钮的时候,系统是会崩溃的。其实是在代理前三步的第三步调用代理方法的时候出了问题,当时的代码如下:
- (void)backButtonClicked:(id)sender
{
CGFloat x = _dragonImageView.frame.origin.x - 10;
if (x > 0) {
_dragonImageView.frame = CGRectMake(x, _dragonImageView.frame.origin.y, 100, 100);
}
[_delegate backButtonClicked:self];
}
我们需要在使用代理前,做一下判断(这一步是很重要的):
SEL backButtonClickedSEL = @selector(backButtonClicked:); // SEL 是一种数据类型 (其实没必要每次都声明一个 SEL 这次只是了解一下有这个数据类型)
if ([_delegate respondsToSelector:@selector(backButtonClicked:)]) {
[_delegate backButtonClicked:self];
// 上面一行代码的意思是,这个代理是否实现了 backButtonClicked: 这个方法,如果实现了的话我就调用它
还有一点时,有时候我们可以在代理的第一步声明代理原型的时候(本来需要创建一个OC 文件 的代理申明头文件),直接在需要调用它的类的 BLDragonView.h 头文件中进行声明操作。
现在来操作点击应用中的红色按钮点击后,龙消失的操作,首先需要将 viewController.m 中的 viewDidLoad {} 方法中的 BLDragonView *dragonView 不是在局部作用域中有效,所以需要在 viewController.h 这个头文件中导入 BLDragonView.h 并创建成员变量:
#import <UIKit/UIKit.h>
#import "BLDragonViewDelegate.h"
#import "BLDragonView.h"
@interface ViewController: UIViewController<BLDragonViewDelegate>
{
UILabel *dragonStatusLabel;
BLDragonView *_dragonView;
}
然后实现隐藏的方法:
- (void)hideButtonClicked:(id)sender
{
_dragonView.dragonImageView.hidden = !_dragonView.dragonImageView.hidden; // 隐藏的变成不隐藏,不隐藏的状态变成隐藏 (即取反操作)
}