异常表示发送给符合KVC标准的"框架"属性

时间:2016-09-29 11:44:09

标签: ios uitableview nsnotificationcenter addobserver

在我的自定义内UITableViewCell我正在做这样的事情。

-(void)checkHeight
{
    if (self.frame.size.height < self.expandedHeight) {
        self.lblReasontitle.hidden=YES;
    }
    else
    {
        self.lblReasontitle.hidden=NO;
    }
}
-(void)watchFrameChanges
{
    if (!isObserving) {

        [[NSNotificationCenter defaultCenter] addObserver:self forKeyPath:@"frame" options: (NSKeyValueObservingOptionNew |NSKeyValueObservingOptionInitial) context:nil];
        isObserving=true;
    }
}
-(void)ignoreFrameChanges
{
    if (isObserving) {
        [[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:@"frame"];
    }
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"frame"]) {
        [self checkHeight];
    }
}

但我得到了这个例外。

  

因未捕获的异常而终止应用程序NSUnknownKeyException,原因:[addObserver:forKeyPath:@&#34; frame&#34; options:5 context:0x0]被发送到&#34; frame&#34;的符合KVC标准的对象。属性。

我不知道那个异常是什么,我怎么能解决它。 请帮我。 感谢

2 个答案:

答案 0 :(得分:1)

从上面的代码我想你想做一对一的沟通。如果是这样的话,那就是KVO,而不是NSNotification。

替换像这样的代码,

-(void)checkHeight
{
    if (self.frame.size.height < self.expandedHeight) {
        self.lblReasontitle.hidden=YES;
    }
    else
    {
        self.lblReasontitle.hidden=NO;
    }
}
-(void)watchFrameChanges
{
    if (!isObserving) {

        [self addObserver:self forKeyPath:@"frame" options: (NSKeyValueObservingOptionNew |NSKeyValueObservingOptionInitial) context:nil];
        isObserving=true;
    }
}
-(void)ignoreFrameChanges
{
    if (isObserving) {
        [self removeObserver:self forKeyPath:@"frame"];
    }
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"frame"]) {
       [self checkHeight];
    }
}

答案 1 :(得分:0)

UIKit元素默认情况下不符合KVO标准 - 直到记录为止。因此,您将获得此异常。尝试注册一些与帧相关的值,它应该可以工作。