【问题标题】:observeValueForKeyPath not callingobserveValueForKeyPath 没有调用
【发布时间】:2026-01-16 04:15:02
【问题描述】:

我正在使用观察者跟随代码

myView = [[UIView alloc] initWithFrame:CGRectZero];
[myView addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];

另一个代码

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"observeValueForKeyPath");
    if([keyPath isEqualToString:@"frame"]) 
    {
        [self layoutViews];
    }
}

但我从来没有得到日志 observeValueForKeyPath

【问题讨论】:

  • 有趣的问题,我不知道答案,但就您要完成的工作而言,有更有效的方法。您应该使用 setNeedsLayout 并让渲染系统在下一轮运行循环中为您完成脏活。
  • 我现在尝试了你的代码,observeValueForKeyPath 被正确调用。您确定 myView 没有在某处发布吗?你是如何更新框架的?代码,在方向改变时自动调整大小等?
  • 是的 .. 实际上我有两个完全原生的代码示例,可以正常工作.. 另一个是作为 phonegap 插件,它不工作github.com/gdavis/FGallery-iPhone/issues/6

标签: iphone uiview addobserver


【解决方案1】:

UIKit 并非始终与 KVO 兼容,您不应理所当然地认为 UIKit 类上的属性永远与 KVO 兼容,即使它们似乎是经过试验的。 p>

另请参阅:iOS: How do I know if a property is KVO-compliant?

【讨论】:

    最近更新 更多