什么是KVO:
KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
1. 注册,指定被观察者的属性,
2. 实现回调方法
3. 移除观察(必须移除观察否则后果严重)
具体运用
1. 控制器
- (void)viewDidLoad {
[super viewDidLoad];
//添加测试按钮点击发送消息
UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
[self.view addSubview:btn];
btn.frame = CGRectMake(100, 100, 20, 20);
[btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
}
- (void)btnClick{
NSLog(@"点击了按钮");
self.tabBarItem.badgeValue = @"111";//改变角标的值
}
2. 添加观察对象
[item addObserver:self forKeyPath:@"badgeValue" options:0 context:nil];
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
[self setTitle:self.item.title forState:UIControlStateNormal];
[self setTitle:self.item.title forState:UIControlStateSelected];
[self setImage:self.item.image forState:UIControlStateNormal];
[self setImage:self.item.selectedImage forState:UIControlStateSelected];
if(self.item.badgeValue)
{
self.badgeButton.hidden = NO;
[self.badgeButton setTitle:self.item.badgeValue forState:UIControlStateNormal];
CGFloat badgeY = 2;
CGFloat badgeH = self.badgeButton.currentBackgroundImage.size.height;
CGFloat badgeW = self.badgeButton.currentBackgroundImage.size.width;
CGFloat badgeX = self.frame.size.width - badgeW - 10;
if(self.item.badgeValue.length>1)
{
CGSize badgeSize = [self.item.badgeValue sizeWithFont:self.badgeButton.titleLabel.font];
badgeW = badgeSize.width + 10;
}
if(badgeW>self.badgeButton.currentBackgroundImage.size.width)
{
badgeX = self.frame.size.width - badgeW;
}
self.badgeButton.frame = CGRectMake(badgeX, badgeY, badgeW, badgeH);
}
else{
self.badgeButton.hidden = YES;
}
}
3. 移除观察
- (void)dealloc
{
[self.item removeObserver:self forKeyPath:@"badgeValue"];
}