关于Category中增加属性的问题
2016-02-29 14:14
543 查看
Category是Objective-C中常用的语法特性,通过它可以很方便的为已有的类来添加函数。但是Category不允许为已有的类添加新的属性或者成员变量。
一种常见的办法是通过runtime.h中objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。通过这种方法来模拟生成属性。
下面是用来制作下拉刷新框架中使用到的一段代码
@interface UIScrollView (CWRefresh)@property (nonatomic,strong) CWRefreshHeaderView *header;@end
上面是声明,下面是头文件的生成
#import "UIScrollView+CWRefresh.h"#import "CWRefreshHeaderView.h"#import <objc/runtime.h>@implementation UIScrollView (CWRefresh)
#pragma mark - header// 关联static char CWRefreshHeaderKey;- (void)setHeader:(CWRefreshHeaderView *)header{ if (header != self.header) { [self.header removeFromSuperview]; [self willChangeValueForKey:@"header"]; objc_setAssociatedObject(self, &CWRefreshHeaderKey, header, OBJC_ASSOCIATION_ASSIGN); [self didChangeValueForKey:@"header"]; [self addSubview:header]; }}
- (CWRefreshHeaderView *)header{ return objc_getAssociatedObject(self, &CWRefreshHeaderKey);}
@end
这样就可以把header当成属性来使用啦。。可以在header上添加各种刷新时候的控件,以及动画啦
一种常见的办法是通过runtime.h中objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。通过这种方法来模拟生成属性。
下面是用来制作下拉刷新框架中使用到的一段代码
@interface UIScrollView (CWRefresh)@property (nonatomic,strong) CWRefreshHeaderView *header;@end
上面是声明,下面是头文件的生成
#import "UIScrollView+CWRefresh.h"#import "CWRefreshHeaderView.h"#import <objc/runtime.h>@implementation UIScrollView (CWRefresh)
#pragma mark - header// 关联static char CWRefreshHeaderKey;- (void)setHeader:(CWRefreshHeaderView *)header{ if (header != self.header) { [self.header removeFromSuperview]; [self willChangeValueForKey:@"header"]; objc_setAssociatedObject(self, &CWRefreshHeaderKey, header, OBJC_ASSOCIATION_ASSIGN); [self didChangeValueForKey:@"header"]; [self addSubview:header]; }}
- (CWRefreshHeaderView *)header{ return objc_getAssociatedObject(self, &CWRefreshHeaderKey);}
@end
这样就可以把header当成属性来使用啦。。可以在header上添加各种刷新时候的控件,以及动画啦
相关文章推荐
- Google Chart API
- x_algor.c 分析
- Django Admin后台使用tinymc 富文本编辑器
- 文本分类与聚类(text categorization and clustering)
- Google Protobuf 简单使用
- ODBC database driver for Go:Go语言通过ODBC 访问SQL server
- 流行的Go语言web框架简介
- Django model.py表单的默认值 默认允许为空
- DJANGO变动库的一次真实手动经历
- django使用rest_framework API认证
- 基于Django的独立运行脚本开发
- GO 开发 IDE 环境--IDEA-go-lang-plugin
- 39. goodbye
- 38. goldwater
- (GOF23设计模式)_代理模式_静态代理
- Google搜索 - 世界各国Google网址大全
- 最小二乘法 (转)good
- golang捕获panic
- 算法代码实现之归并排序,Golang(Go语言)实现,自顶向下与自底向上两种方式
- 第一个django,django项目