【问题标题】:How to be notified when a UIView detached from its superView?当 UIView 与其 superView 分离时如何得到通知?
【发布时间】:2011-03-05 17:36:06
【问题描述】:

UIView 好像没有“didRemoveFromSuperview”或“willRemoveFromSuperview”这样的方法。那么,当 UIView 从它的 superView 中移除时如何监听事件?我应该使用 KVO 吗?提前致谢!

【问题讨论】:

  • 您知道视图何时被删除,因为无论如何您都是在代码中完成的?只需在此处连接您的代码或辅助函数即可。

标签: ios iphone uiview key-value-observing


【解决方案1】:

这可行(在 iOS8 上测试):

-(void) didMoveToWindow {
    [super didMoveToWindow]; // (does nothing by default)
    if (self.window == nil) {
        // YOUR CODE FOR WHEN UIVIEW IS REMOVED
    }
}

According to the UIView docs:

这个方法的默认实现什么都不做。子类可以覆盖它以在窗口发生变化时执行其他操作。

window 属性可能为 nil... 当接收器刚刚从其父视图中移除时会发生这种情况,或者当接收器刚刚添加到一个父视图中时未附加到窗口。

【讨论】:

    【解决方案2】:
    - (void) willMoveToSuperview: (UIView *) newSuperview{
        if(newSuperview == nil){
            // UIView was removed from superview
        } else {
            // UIView was added to superview
        }
    }
    

    【讨论】:

      【解决方案3】:

      这个话题很老了,但我找到了一种方法。由于谷歌搜索没有足够的帮助,这里是(取自 UIView 的文档)

      观察与视图相关的变化

      --didAddSubview:

      – willRemoveSubview:

      – willMoveToSuperview:

      --didMoveToSuperview

      – willMoveToWindow:

      --didMoveToWindow

      【讨论】:

      • 这不是我们所要求的。在问题中明确指出,当视图从其超级视图中删除时,没有方法可以得到通知。这可能是 UIView 类具有但不为所要求的用例提供任何方法的视图层次结构更改方法的列表。
      • “在问题中明确指出,当视图从其超级视图中删除时,没有方法可以得到通知”你知道有时提出问题的人可能是错的,而且不是“明确提出”。答案是正确的,您可以检查是否在 didMoveToSuperview(如果 superview 为 nil)或 didMoveToWindow(如果 window 为 nil)中删除了视图
      【解决方案4】:

      您可以继承您的 UIView 并从它的 - (void)removeFromSuperview 方法发布通知。

      【讨论】:

      • I find.Api doc 说: willMoveToSuperview:通知接收者它的superview 即将更改为指定的superview(可能为nil)。 ----------------------------------------- 当调用此方法且参数为无,视图正在被删除
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      相关资源
      最近更新 更多