我正在使用键值观察来在某些属性发生更改时执行特定操作(例如,每当其帧或边界发生更改时重定向自定义UIView的子视图)。有没有办法看到谁(即什么功能)触发这种变化?在我的observeValueForKeyPath:ofObject:change:context:
中添加断点无济于事,因为我认为我无法看到是谁导致了frame
或bounds
导致KVO被触发的更改。
在我的具体例子中,我无法弄清楚是什么改变了我的UIView的尺寸。
编辑#1:我的堆栈跟踪的屏幕截图,在observeValue...
另请注意,这仅用于调试目的。
答案 0 :(得分:0)
一般情况下,除了查看堆栈跟踪之外,您无法知道导致特定KVC突变的原因(以及KVO通知)。在这种情况下,-[UIView(Geometry) _applyAutoresizingMaskWithOldSuperviewSize]
似乎是罪魁祸首,但更一般地说,它似乎是取消归档并布局触发通知的视图的过程。由于此更改不是来自您的代码,因此我不确定知道它来自哪里会有所帮助。
你可以使用一些技巧将你自己的代码中的“知识”从堆栈中的较高层传递到堆栈中较低的观察方法。您可以在[[NSThread currentThread] threadDictionary]
中存储一个标志/值,然后在您的观察者方法中检查它(记住在您的较高堆栈帧返回之前显式删除该标志。)这样说,这样做有点狡猾,并且在最重要的是,它不会向您提供有关此类案例的任何信息,因为您的代码不会直接触发更改。