0

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

在我的具体例子中,我无法弄清楚我的UIView的尺寸是由谁来改变的。

编辑#1:我的堆栈跟踪的截屏,暂停时帧/边界时内observeValue...

叫另外请注意,这只是用于调试目的。

Stack Trace

+1

确定吗?尝试拖动堆栈跟踪窗口底部的滑块一直到右侧,您应该能够看到修改您正在观察的属性的函数 – CodaFi 2013-03-26 21:50:06

+0

我添加了我的堆栈跟踪窗口的屏幕截图,所以请让我知道你看到了什么。我总是很难阅读这些。 – 2013-03-26 22:01:37

+0

感谢@MartinR。任何想法什么'autoresizeArchivedView'是为什么它被称为?这不是我写的功能。如果这是相关的(?),我将'autoLayout'关闭。 – 2013-03-26 22:13:11

回答

0

一般来说,不,比看堆栈跟踪等,你可以不知道是什么原因导致一个特定的KVC突变(因此KVO通知)。在这种情况下,-[UIView(Geometry) _applyAutoresizingMaskWithOldSuperviewSize]似乎是罪魁祸首,但更普遍的情况是,它似乎是对触发通知的视图进行解除归档和布局的过程。由于此更改不是来自您的代码,所以我不确定如何知道它来自何处会有所帮助。

你可以玩一些技巧,将你自己的代码中的“知识”从堆栈中传递到堆栈中较低的观察方法。你可以在[[NSThread currentThread] threadDictionary]中存储一个标志/值,然后在你的观察者方法中检查它(记住在你的更高堆栈帧返回之前显式移除该标志)。这就是说,这样做有点不妥,而且最重要的是,它不会给你任何关于这种情况的信息,而你的代码不是直接触发变化的。