为啥 KVO 不能在 UIView 子类上工作?

Posted

技术标签:

【中文标题】为啥 KVO 不能在 UIView 子类上工作?【英文标题】:why is KVO not working on UIView subclass?为什么 KVO 不能在 UIView 子类上工作? 【发布时间】:2012-08-10 22:20:33 【问题描述】:

我有一个 UIView 子类,它又具有一个 contentView,在公共标头中声明如下:

@property (nonatomic,retain)UIVivew* contentView;

我试图在 contentView 的框架发生变化时获取 KVO 通知,但在我的 UIView 子类中从未调用过 observeValueForKeyPath 方法:

@implementation MyView


@synthesize contentView = _contentView;


- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code

        [self.contentView addObserver:self 
                           forKeyPath:@"frame" 
                              options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) 
                              context:nil];
       
    return self;


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
    if ([keyPath isEqualToString:@"frame"]) 
        CGRect newContentFrame = [[change objectForKey:NSKeyValueChangeNewKey] CGRectValue];
        CGRect selfNewFrame = self.frame;
        selfNewFrame.size = CGSizeMake(newContentFrame.size.width + 10, newContentFrame.size.height + 10);
        self.frame = selfNewFrame;
    

    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];

关于为什么 KVO 没有触发的任何想法?

【问题讨论】:

【参考方案1】:

对不起……我猜是剥夺睡眠……

忘记分配/初始化 contentView。

【讨论】:

所以这解决了问题?尽可能选择它作为答案 - 谢谢!

以上是关于为啥 KVO 不能在 UIView 子类上工作?的主要内容,如果未能解决你的问题,请参考以下文章

iOS5 中我的 UIView CGRect 属性上的 KVO 不起作用

drawRect 在 UIView 子类上被调用,但不在 UIViewController 上

当我继承 UIView 时,为啥我不能在图像上绘图?

UIView 子类不能从黑色背景更改

为啥我使用 NSManagedObject 在 self 上获得基于块的崩溃清除 KVO?

为啥 UIView 不需要 QuartzCore.framework 工作?