zoukankan      html  css  js  c++  java
  • 创建UIBarButtonItem的分类

    #import "UINavigationBar+Add.h"

    #import "NSObject+Add.h"

    static const int UI_BAR_BUTTON_ITEM_BLOCK_KEY;

    @interface UIBarButtonItemBlockTarget : NSObject

    @property (nonatomic, copy) UIBarButtonItemActionBlock block;

    - (id)initWithBlock:(UIBarButtonItemActionBlock) block;

    - (void)invoke:(id)sender;

    @end

    @implementation UIBarButtonItemBlockTarget

    - (id)initWithBlock:(UIBarButtonItemActionBlock)block// 创建一个Block

    {

        self = [super init];

        if (self)

        {

            _block = [block copy];

        }

        return self;

    }

    - (void)invoke:(id)sender

    {

        !self.block?:self.block(sender);

    }

    @end

    @implementation UIBarButtonItem (Add)

    - (void)setActionBlock:(UIBarButtonItemActionBlock)block

    {

        if (!block) return;

        

        UIBarButtonItemBlockTarget *target = [[UIBarButtonItemBlockTarget alloc] initWithBlock:block];

        

        // 系统类不允许添加实例变量、使用Runtime来关联

        [self setAssociateValue:target withKey:&UI_BAR_BUTTON_ITEM_BLOCK_KEY];

        [self setTarget:target];

        [self setAction:@selector(invoke:)];

    }

    - (UIBarButtonItemActionBlock)actionBlock

    {

        // 系统类不允许添加实例变量、使用Runtime来关联

        UIBarButtonItemBlockTarget *target = [self getAssociatedValueForKey:&UI_BAR_BUTTON_ITEM_BLOCK_KEY];

        return target.block;

    }

    + (UIBarButtonItem *)barButtonItemWithTarget:(id)target

                                          Action:(SEL)action

                                           image:(NSString *)image

                                HighlightedImage:(NSString *)highlightedImage

    {

        UIButton *button = [[UIButton alloc] init];

        

        [button setImage:[UIImage imageNamed:image] forState:UIControlStateNormal];

        [button setImage:[UIImage imageNamed:highlightedImage] forState:UIControlStateHighlighted];

        [button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];

        button.size = button.currentImage.size; // 避免图片拉伸

        

        return [[UIBarButtonItem alloc] initWithCustomView:button];

    }

    /**

     *  @param image            默认图片

     *  @param highlightedImage 高亮状态图片

     *  @param actionBlock      回调block

     *

     *  @return barButtonItem

     */

    + (UIBarButtonItem *)barButtonItemWithImage:(NSString *)image highlightedImage:(NSString *)highlightedImage actionBlock:(UIBarButtonItemActionBlock)actionBlock

    {

        UIBarButtonItem *barButtonItem = [UIBarButtonItem barButtonItemWithTarget:nil

                                                                           Action:nil

                                                                            image:image

                                                                 HighlightedImage:highlightedImage];

        

        if (actionBlock)

        {

            [barButtonItem setActionBlock:actionBlock];

        }

        

        return barButtonItem;

    }

    /**

     *  @param image            默认图片

     *  @param highlightedImage 高亮状态图片

     *  @param actionBlock      回调block

     *

     *  @return barButtonItem

     */

    + (UIBarButtonItem *)barButtonItemWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style actionBlock:(UIBarButtonItemActionBlock)actionBlock

    {

        UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithTitle:title style:style target:nil action:nil];

        

        if (actionBlock)

        {

            [barButtonItem setActionBlock:actionBlock];

        }

        

        return barButtonItem;

    }

    @end

    这样做虽然复杂点,但是代码聚合起来更加方便清晰,难点:系统类不允许添加实例变量

    所以使用runtime来关联属性

    这样写就像:如果afnetworking不是以块,而是以代理的方式来做,会很麻烦

    使用方法:这样关联创建和点击事件

    self.navigationItem.rightBarButtonItem = [UIBarButtonItem barButtonItemWithTitle:@"Scroll" style:UIBarButtonItemStyleDone actionBlock:^(id sender) {

            NSLog(@"123");

        }];

  • 相关阅读:
    【MySQL笔记】数据定义语言DDL
    【MySQL笔记】SQL语言四大类语言
    《ggplot2:数据分析与图形艺术》,读书笔记
    【数据处理】为什么数据要取对数
    【R实践】时间序列分析之ARIMA模型预测___R篇
    【R笔记】使用R语言进行异常检测
    【R笔记】日期处理
    朴素贝叶斯分类器的应用
    数据分析的方法与技术
    爬虫 测试webmagic (一)
  • 原文地址:https://www.cnblogs.com/happyEveryData/p/5546092.html
Copyright © 2011-2022 走看看