0

每当某些属性发生更改时,我都会使用键值观察来执行特定操作(例如,每当其框架或边界发生更改时,重新布局自定义 UIView 的子视图)。有什么方法可以查看是谁(即什么功能)触发了这种变化?在 my 中设置断点observeValueForKeyPath:ofObject:change:context:并没有帮助,因为我认为我看不到是谁导致了更改framebounds导致 KVO 被触发。

在我的具体示例中,我无法弄清楚谁/什么在改变我的 UIView 的尺寸。

编辑#1:我的堆栈跟踪的屏幕截图,在调用帧/边界时暂停observeValue...

另请注意,这仅用于调试目的。

堆栈跟踪

4

1 回答 1

0

一般来说,不,除了查看堆栈跟踪之外,您不知道是什么导致了特定的 KVC 突变(以及因此 KVO 通知)。在这种情况下,-[UIView(Geometry) _applyAutoresizingMaskWithOldSuperviewSize]似乎是罪魁祸首,但更一般地说,它似乎是取消归档和布局触发通知的视图的过程。由于此更改并非来自您的代码,因此我不确定知道它的来源会有多大帮助。

您可以使用一些技巧将“知识”从您自己的堆栈较高的代码传递到堆栈较低的观察方法。您可以在其中存储一个标志/值,[[NSThread currentThread] threadDictionary]然后在您的观察者方法中检查它(记住在更高的堆栈帧返回之前显式删除标志。)也就是说,这样做有点恶心,最重要的是,它不会为您提供有关此类情况的任何信息,其中您的代码不是直接触发更改的内容。

于 2013-06-18T12:45:59.700 回答