美文网首页
15、代理(下)

15、代理(下)

作者: HQ今日磨墨 | 来源:发表于2015-08-05 18:07 被阅读18次

    代理中的方法有两种类型,一种是 @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;        // 隐藏的变成不隐藏,不隐藏的状态变成隐藏   (即取反操作)
    }
    

    相关文章

      网友评论

          本文标题:15、代理(下)

          本文链接:https://www.haomeiwen.com/subject/rszvqttx.html