2011-12-08 133 views
2

在视图控制器中,我创建了一个子视图数组,它可以随时从父视图中删除,所以它们的寿命比视图控制器的寿命短。如何移除KVO观察者?

在创建他们我做很多这样的:

  • 分配/初始化子视图
  • 添加视图控制器作为子视图的frame财产的观察员。
  • 其添加到保留阵列
  • 它添加到视图
  • 释放它

的子视图不必视图控制器的引用。

当用户删除子视图时,它将被取消分配,并且在控制台中出现错误,告诉我视图的frame关键路径的观察者未被删除。

当被观察的子视图不保留对观察者的引用时,如何删除观察者?

反正有没有办法像removeAllObservers这样?

我不希望在子视图中创建对观察者的引用,因为它有点失败了KVO(我可能会使用委托设置)。

+1

当你从保留的数组中移除UIView时,你不能移除观察者吗? –

+0

您是否可以告诉观察者也观察子视图本身,并在视图关闭时停止观察?我不确定这是否可能 - 如果没有,请参阅cwieland的答案。 – Daniel

+0

但是,如果视图控制器在子视图之前解除分配,会发生什么?我知道它会通过释放数组并删除子视图来释放子视图,尝试删除已移除的观察者是否安全? –

回答

0

我不知道你为什么观察框架,但如果你只是想知道它何时被删除,你可以改为使用NSNotificationCenter。从那里你的子视图可以发布到通知中心,它已被更改/删除。然后,您的父视图会看到该通知,并可以根据通知中的内容对其执行一些操作。这是一个更松散绑定kvo。

这是设置它的一个很好的例子。 Send and receive messages through NSNotificationCenter in Objective-C?

通过这种方式,超级视图只需在通知中心将其自身从释放/卸载的通知中删除即可。

在任何情况下,除KVO和代表之外,这是另一种方法。

+0

我不想观察帧的改变,所以我可以更新其他视图的帧。我已经在使用通知中心查看何时删除视图。 –