iOS开发 runtime运行时的学习笔记一

1.利用runtime在类别category中添加属性

@property  (nonatomic,strong) YHBadgeLabel *badgeLabel; 因为在ios中在类别中只可以添加方法,不能添加属性,但是可以通过runtime动态的添加属性,其原理是:就是通过设置关联对象,相当于oc中的键值对应关系。

设置关键字 staticNSString  *const  kYHBadgeLabel =@"kYHBadgeLabel"; 

#pragma mark - get/set

-(YHBadgeLabel*) badgeLabel{

    //通过retime取得关联对象  因为在类别中不允许有实例变量

      //通过关键字取得关联对象

    return objc_getAssociatedObject(self, &kYHBadgeLabel);

}

set方法

-(void) setBadgeLabel:(YHBadgeLabel*)badgeLabel{

    //设置关联对象

    /*

       源对象 ---> self

       关键字 ---> &kYHBadgeLabel

       关联的对象 ---> badgeLabel

       关联策略  ---> OBJC_ASSOCIATION_RETAIN_NONATOMIC

     */

    objc_setAssociatedObject(self, &kYHBadgeLabel, badgeLabel, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

这样通过runtime对badgeLabel增加get方法和set方法 ,在类别中 就可以使用badgeLabel属性了。

#pragma mark - private

//懒加载 YHBadgeLabel

-(void) lazyLoadingBadgeLabel{

    //因为在Category 不能有实例变量  所以为了初始化YHBadgeLabel 只能通过runtime的关联对象来 进行初始化

    if(!self.badgeLabel) {

        self.badgeLabel = [YHBadgeLabel defaultAllocYHBadgeLabel];

        self.badgeLabel.center=CGPointMake(self.yh_width,0);

        [selfaddSubview:self.badgeLabel];

        [self bringSubviewToFront:self.badgeLabel];

    }

}

一下是利用类别写的一个小红点组件,引入UIView+YHBadgeView.h文件就能使用

UIView+YHBadgeView.h文件


UIView+YHBadgeView.h

UIView+YHBadgeView.m文件


UIView+YHBadgeView.m文件

YHBadgeLabel.h  小红点label


YHBadgeLabel.m

最后调用


给tabbaritem添加小红点

#pragma mark - 获取Badge的父视图 (tabbarItem上使用)

- (UIView*) tabbarView{

    //通过XCode视图调试工具找到UITabBarItem原生Badge父视图

    UIView*tabBarButton = [selfvalueForKey:@"_view"];

    for(UIView*subViewintabBarButton.subviews) {

        if ([subView isKindOfClass:NSClassFromString(@"UITabBarSwappableImageView")]) {

            returnsubView;

        }

    }

    returntabBarButton;

}


给导航栏navigationItem添加小红点

#pragma mark - 获取Badge的父视图 (navigationItem上使用)

- (UIView*) navigationView {

    //通过XCode视图调试工具找到navigationItem原生Badge父视图

    UIView*navigationButton = [selfvalueForKey:@"_view"];

    for(UIView*subViewinnavigationButton.subviews) {

        if ([subView isKindOfClass:NSClassFromString(@"UIImageView")]) {

            returnsubView;

        }

    }

 returnnavigationButton;

}

你可能感兴趣的:(iOS开发 runtime运行时的学习笔记一)