iOS使用Runtime给分类动态绑定属性

在runtime时,动态的给对象增加键值或属性(或者形象的比喻为给对象Object插上本没有的大翅膀,让Object的能力更强大),通过#import<objc/runtime.h>,调用下面的两个函数即可以实现:

objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);

id objc_getAssociatedObject(id object, const void *key);

先看给对象动态的绑定其它对象或值的例子:

static NSString * const key = @"Button_Key";
static NSString * const labelKey = @"Label_Key";

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(30, 30, 80, 40)];
    [button setTitle:@"测试" forState:UIControlStateNormal];
    [button setTitleColor:UIColorMake(30, 30, 100) forState:UIControlStateNormal];
    [button addTarget:self action:@selector(clickEvent:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(30, 80, 140, 40)];
    label.text = @"label_text";
    [self.view addSubview:label];
    
    objc_setAssociatedObject(button, &key, @"nice_button", OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    objc_setAssociatedObject(button, &labelKey, label, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (void)clickEvent:(id)sender {
    UIButton *tempButton = sender;
    NSString *string = objc_getAssociatedObject(tempButton, &key);
    NSLog(@"%@", string);
    
    UILabel *tempLabel = objc_getAssociatedObject(tempButton, &labelKey);
    tempLabel.text = string;
}

例子的效果是:点击按钮后,label的文字变成了nice_button。

上面就是通过设置了两个Key值,分别绑定了string和label对象到button上,在点击事件中通过键Key取出了对应的string和label。

常见的应用还有给类增加额外的属性,这里需要分类category与runtime绑定的配合,大概代码如下:

//ViewController+Objc.h文件

#import "ViewController.h"

@interface ViewController (Objc)
@property (nonatomic, retain) NSString *themeText;  //主题内容
@end

----------------------------------

//ViewController+Objc.m文件

#import "ViewController+Objc.h"
#import <objc/runtime.h>

static NSString * const themeKey = @"theme_key";

@implementation ViewController (Objc)

- (NSString *)themeText {
    return (NSString *)objc_getAssociatedObject(self, &themeKey);
}

- (void)setThemeText:(NSString *)themeText {
    objc_setAssociatedObject(self, &themeKey, themeText, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

这样就给ViewController增加了一个themeText的string属性。然后就可以在代码里,愉快的调用self.themeText了。

开始我觉得ViewController+Objc.h文件里,已经写了themeText了,当然可以调用了,完全不需要runtime的绑定代码。其实试了下,语法可以通过,但是运行会nil异常报错。

但是如果为了更好的理解动态的增加属性,可以把ViewController+Objc.h文件写成这样:

#import "ViewController.h"

@interface ViewController (Objc)
- (NSString *)themeText;
- (void)setThemeText:(NSString *)themeText;
@end

程序依旧可以运行。这样看起来,就可以更好的理解给类动态的绑定增加属性了。

转载于:https://www.cnblogs.com/vokie/p/9300009.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MVVM(Model-View-ViewModel)是一种软件设计模式,常用于iOS开发中。它的核心思想是将UI的状态和行为从View中抽离出来,把业务逻辑和数据处理交给ViewModel,让View只负责展示和响应用户的操作。 在iOS开发中,实现MVVM模式的动态绑定可以借助一些第三方库,比如ReactiveCocoa、RxSwift等。这些库提供了响应式编程的支持,让开发者可以更方便地实现数据绑定和响应式UI。 动态绑定是MVVM的一个重要概念,通过它可以实现ViewModel和View之间的双向绑定。具体而言,当ViewModel的数据发生变化时,View会自动更新,而当View上的用户操作导致数据变化时,ViewModel也会相应地更新。 在MVVM中,一个常见的动态绑定方式是使用观察者模式。ViewModel可以通过对属性进行观察,当属性值发生变化时,自动更新对应的UI。而View上的用户操作,比如按钮点击、文本输入等,可以通过事件触发的方式通知ViewModel,进而更新数据。 通过动态绑定,MVVM可以实现更灵活、响应式的界面更新,提高代码的可读性和可维护性。同时,ViewModel和View的解耦也方便了测试和复用,使代码更加模块化。 总的来说,iOS开发中使用MVVM和动态绑定可以提升开发效率,降低代码复杂度,并使得UI开发更加灵活和响应式。同时,借助一些第三方库可以更方便地实现MVVM模式和动态绑定

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值