在HTML 中一旦 为视图绑定了 变量,当后续变量值发生改变时,视图上的值可以自动改成相应的值。
当然,这在iOS中也很容易实现。通知。代理。block 回调。甚至本地化+跳转刷新。
但是这些方式,都需要写较多的代码就实现。
实例场景: 多个界面均显示 用户昵称。当用户编辑修改昵称之后。需要其他界面都同时修改。
新方法实现思路:
自定义子类继承UILabel, 对象在创建之后存储起来到一个静态数组中。提供一个类方法,当label 发生改变时调用。其他子类对应改变。只需要一行代码,同时只需要在触发源处调用,其他视图类不需要添加代码,减少耦合。
实现代码:
头文件
@interface BindLabel : UILabel
+ (id)shareInstance;
// 查看池内量
+ (void)countOfBind;
// 修改
+ (void)change:(NSString *)content;
@end
实现文件:
static NSMutableArray <BindLabel*>*mBindLabelArr; // 存储池
@implementation BindLabel
+ (id)shareInstance{
if (mBindLabelArr == nil) {
mBindLabelArr = [NSMutableArray new];
}
BindLabel* bl = [[BindLabel alloc] init];
[mBindLabelArr addObject:bl];
return bl;
}
+ (void)countOfBind{
NSLog(@"countBind = %lu",(unsigned long)mBindLabelArr.count);
}
+ (void)change:(NSString *)content{
[mBindLabelArr enumerateObjectsUsingBlock:^(BindLabel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
obj.text = content;
}];
}
// 经测试,label 所在 VC 出栈时,触发willMoveToSuperview:,newSuperview=null。已经销毁的lable 从池中删除
- (void)willMoveToSuperview:(UIView *)newSuperview{
if (newSuperview == NULL) {
[mBindLabelArr removeObject:self];
}
}
@end
调用方法
[BindLabel change:@"1234"];
经测试,可以实现绑定变化 效果。