【问题标题】:How to remove KVO observer?如何移除 KVO 观察者?
【发布时间】:2012-01-16 08:12:13
【问题描述】:

在视图控制器中,我创建了一个子视图数组,可以随时从父视图中删除,因此它们的寿命比视图控制器的寿命短。

在创建它们时,我几乎会这样做:

  • 分配/初始化子视图
  • 将视图控制器添加为子视图的frame 属性的观察者。
  • 将其添加到保留数组中
  • 将其添加到视图中
  • 释放它

子视图没有对视图控制器的引用。

当用户删除子视图时,它会被释放,并且我在控制台中收到一个错误,告诉我视图的 frame 键路径的观察者尚未删除。

当被观察的子视图没有保持对观察者的引用时,我如何删除观察者?

难道就没有像removeAllObservers这样的事情吗?

我宁愿不必在子视图中创建对观察者的引用,因为它在某种程度上违背了 KVO 的观点(我不妨使用委托设置)。

【问题讨论】:

  • 从保留数组中移除 UIView 时不能移除观察者吗?
  • 你能告诉观察者也观察子视图本身,并在视图关闭时停止观察吗?我不确定这是否可能 - 如果没有,请参阅 cwieland 的回答。
  • 但是如果视图控制器在子视图之前被释放会发生什么?我知道它会通过释放数组并删除子视图来释放子视图,尝试删除已经被删除的观察者是否安全?

标签: iphone objective-c ios key-value-observing


【解决方案1】:

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

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

通过这种方式,当它被释放/卸载时,superview 只需要在通知中心删除它自己来查看该术语。

无论如何,这是除 KVO 和委托之外的另一种方法。

【讨论】:

  • 我不想观察框架何时发生变化,因此我可以更新其他视图的框架。我已经在使用通知中心查看视图何时被删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多