zoukankan      html  css  js  c++  java
  • RunTime 给类添加属性

    RunTime
    网上有很多人都不知道Runtime到底是干嘛的?有很多博主都是长篇大论给他们讲这个讲那个,我感觉还不如实例来的实在。
    很简单的一个例子:我们都知道会有这样的需求,未读消息列表的图片上要有一个红点。但是有的要黄点,有的要黑点,那你怎么写的呢?那你总不能一个一个的改吧,所以我们就可以用到Runtime.

    1.首先建一个扩展类,给类添加一个颜色属性的Badge
    #import <UIKit/UIKit.h>
    @interface UIButton (MessageButton)
    @property (nonatomic,strong) UIColor *badgeBGColor;

    2. 然后 在 .m 文件里面 导入包
    #import <objc/runtime.h>

    3. 然后给这个属性 创建一个唯一的内存地址
    static const char bageBGColorKey;

    4.首先实现他的 set get 方法
    -(void)setBadgeBGColor:(UIColor *)badgeBGColor
    {
    objc_setAssociatedObject(self, &bageBGColorKey, badgeBGColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    -(UIColor *)badgeBGColor {

    return objc_getAssociatedObject(self, &bageBGColorKey);
    }

    5. 这里要说有一个点就是要用底层的api 开实现方法  
    objc_setAssociatedObject
    objc_getAssociatedObject
    这个其实就是前面加个objc 而已

    6.然后再建一个 方法来实现他的 badge
    -(void)framBGColor:(UIColor *)color
    {
    UIImageView *imageViewBgColor = [[UIImageView alloc]initWithFrame:CGRectMake(self.size.width-5, 0, 5, 5)];
    imageViewBgColor.backgroundColor = color;
    imageViewBgColor.layer.cornerRadius = 2.5f;
    imageViewBgColor.layer.masksToBounds = YES;
    [self addSubview:imageViewBgColor];

    }
    7. 再set方法里面调用这个方法
    -(void)setBadgeBGColor:(UIColor *)badgeBGColor
    {
    objc_setAssociatedObject(self, &bageBGColorKey, badgeBGColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    [self framBGColor:badgeBGColor];
    }

    8、其实有很多的方法都可以用到 比如button 要传多个属性的时候 也可以用的。可以添加很多属性和方法。

  • 相关阅读:
    Linux入门之系统启动
    2017.12.25 Android数据存储方案
    2017.12.18 Android开发之进程讲解
    2017.12.18 Android开发之消息队列(实现子线程修改UI组件)
    2017.12.4 Android开发之ListView组件
    2017.12.10 把KIE的jbpm_console嵌入到我们的web项目中
    2017.12.07 React组件嵌套以及for循环渲染子组件
    2017.12.07 React路由到不同组件界面
    2017.12.07 Ajax获取服务器数据并发送到前端
    B-树&B+树以及其在数据库中的应用
  • 原文地址:https://www.cnblogs.com/yuejunjie/p/6635068.html
Copyright © 2011-2022 走看看