文档章节

扩展类添加属性,即运行时添加属性

大番薯
 大番薯
发布于 2016/03/26 14:43
字数 350
阅读 2
收藏 0

在自定义扩展类时,可以通过运行时添加属性。

关键点在于,首先必须导入运行时头文件,即“#import <objc/runtime.h>”;其次,设置属性,即“objc_setAssociatedObject(self, &keyLineBottom, lineBottom, OBJC_ASSOCIATION_RETAIN);”;还有是获得设置的属性,如“UIImageView *lineBottom = objc_getAssociatedObject(self, &keyLineBottom);


示例如下(UITableViewCell添加底端分割线属性):

.h文件

#import <UIKit/UIKit.h>


@interface UITableViewCell (CellLine)


/// 设置分割线

- (void)showLineView:(CGFloat)offX color:(UIColor *)lineColor type:(CellLineShowType)type;


/// 底端分割线

@property (nonatomic, strong) UIImageView *lineViewButtom;


@end


.m文件

#import "UITableViewCell+CellLine.h"

#import <objc/runtime.h>


static NSString *const keyLineTop = @"lineTopView";

static NSString *const keyLineBottom = @"lineBottomView";


static CGFloat const heightLine = 0.5; // 默认分割线高度


@implementation UITableViewCell (CellLine)


/// 设置分割线

- (void)showLineView:(CGFloat)offX color:(UIColor *)lineColor type:(CellLineShowType)type

{

    // 底端分割线

    UIImageView *lineBottom = objc_getAssociatedObject(self, &keyLineBottom);

    if (!lineBottom)

    {

        lineBottom = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, (CGRectGetHeight(self.bounds) - heightLine), CGRectGetWidth(self.bounds), heightLine)];

        [self.contentView addSubview:lineBottom];

        

        objc_setAssociatedObject(self, &keyLineBottom, lineBottom, OBJC_ASSOCIATION_RETAIN);

    }


    CGRect rectButtom = lineBottom.frame;

    rectButtom.origin.x = offX;

    lineBottom.frame = rectButtom;

    

    lineBottom.backgroundColor = lineColor;

    lineBottom.image = [UIImage imageWithColor:lineColor andSize:CGSizeMake(1.0, 1.0)];

    

    // 顶端分割线

    UIImageView *lineTop = objc_getAssociatedObject(self, &keyLineTop);

    if (!lineTop)

    {

        lineTop = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, CGRectGetWidth(self.bounds), heightLine)];

        [self.contentView addSubview:lineTop];

        

        objc_setAssociatedObject(self, &keyLineTop, lineTop, OBJC_ASSOCIATION_RETAIN);

    }

    

    CGRect rectTop = lineTop.frame;

    rectTop.origin.x = offX;

    lineTop.frame = rectTop;

    

    lineTop.backgroundColor = lineColor;

    lineTop.image = [UIImage imageWithColor:lineColor andSize:CGSizeMake(1.0, 1.0)];

    

    switch (type)

    {

        case CellLineShowNone:

        {

            lineBottom.hidden = YES;

            lineTop.hidden = YES;

        }

            break;

        case CellLineShowAll:

        {

            lineBottom.hidden = NO;

            lineTop.hidden = NO;

        }

            break;

        case CellLineShowButtom:

        {

            lineBottom.hidden = NO;

            lineTop.hidden = YES;

        }

            break;

        case CellLineShowTop:

        {

            lineBottom.hidden = YES;

            lineTop.hidden = NO;

        }

            break;

            

        default:

            break;

    }

}


#pragma mark - setter/getter


- (void)setLineViewButtom:(UIImageView *)lineViewButtom

{

    objc_setAssociatedObject(self, &keyLineBottom, lineViewButtom, OBJC_ASSOCIATION_RETAIN);

}


- (UIImageView *)lineViewButtom

{

    UIImageView *line = objc_getAssociatedObject(self, &keyLineBottom);

    return line;

}


- (void)setLineViewTop:(UIImageView *)lineViewTop

{

    objc_setAssociatedObject(self, &keyLineTop, lineViewTop, OBJC_ASSOCIATION_RETAIN);

}


- (UIImageView *)lineViewTop

{

    UIImageView *line = objc_getAssociatedObject(self, &keyLineTop);

    return line;

}


@end



本文转载自:http://blog.csdn.net/potato512/article/details/50484457

大番薯
粉丝 0
博文 167
码字总数 0
作品 0
深圳
私信 提问
如何给iOS 分类添加 属性

比如我们封装了一个类,不想再动它了,但是我们又需要在那个类中增加一些方法,这时候我们就不必在那个类中做修改或者再定义一个它的子类, 只需要添加一个(Category)即可。但是如果我们想给他添...

王素年
2016/05/27
922
0
iOS进阶之runtime作用

图片来源于网络 前言 Runtime基本是用C和汇编写的,可见苹果为了动态系统的高效而作出的努力。你可以在这里下到苹果维护的开源代码。苹果和GNU各自维护一个开源的runtime版本,这两个版本之间...

DWade_Coding
2017/10/09
0
0
iOS 面试全方位剖析 -- OC语言特性篇 (一)

分类 & 关联对象 & 扩展 & 代理 (一) 通知 KVO KVC 属性关键字. (二) 分类 你用分类都做了哪些事 ? 特点 讲特点是为了能更好的和扩展区分开来 分类中都可以添加哪些内容 分类的实现机制 同一...

PetitBread
2018/05/14
0
0
马上着手开发 iOS 应用程序 至 读后笔记

目标-操作机制: 当用户轻按“Hello”按钮时,您想要按钮发送一则“更改问候语”的消息(操作)给视图控制器(目标)。 实现文件中的类扩展是申明类的专有属性和方法的地方。 IBAction 是一个...

芒果阿狸
2012/12/11
512
0
Objective-C Runtime 之动态方法解析实践

作为一种动态编程语言,Objective-C 拥有一个运行时系统来支持动态创建类,添加方法、进行消息传递和转发。利用 Objective-C 的 Runtime 可以实现一些很棒的功能。本篇文章会简单介绍一下消动...

力谱宿云
2016/04/11
757
1

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部