UIView 的 viewDidDisappear

Posted

技术标签:

【中文标题】UIView 的 viewDidDisappear【英文标题】:viewDidDisappear for UIView 【发布时间】:2014-05-31 14:18:27 【问题描述】:

我在主视图中添加了这样的子视图:

    BTLPXYPad *XYPad = [[BTLPXYPad alloc] initWithFrame: CGRectMake (30, 10, 280, 460)];
    [window addSubview:XYPad];

完成我需要做的所有事情,然后在 BTLPXYPad 类中使用它删除它:

    [self removeFromSuperview];

我需要的是在任务完成后执行它。我知道使用 UIViewController 类型类我可以使用 viewDidDissapear 但我似乎无法为 UIView 类型找到相同的东西。有人可以帮忙吗?

【问题讨论】:

UIView 有一个willRemoveSubview: 方法,参见here。或者您可以在 UIView 子类中覆盖 removeFromSuperview What similar functionality method (viewWillAppear) exists on UIView?的可能重复 【参考方案1】:

要知道您的视图何时实际被删除,您可以实现 didMoveToSuperview 并检查超级视图现在是否为 nil

- (void)didMoveToSuperview;

  [super didMoveToSuperview];

  if (!self.superview) 
    NSLog(@"Removed from superview");
  
 

【讨论】:

【参考方案2】:
[self removeFromSuperview];

我需要的是在任务完成后执行它。

当你说[self removeFromSuperview] 时,它已经消失了。 看起来消失了只有一个运行循环的延迟,但删除视图会删除视图。

所以解决方案就是继续你的“任务一旦完成”:

[self removeFromSuperview];
// do your task

如果“做你的任务”代码似乎放错了地方,那就不是。您需要在视图消失时通知视图这一事实表明您的架构一开始就是错误的。视图不应该执行任何“任务”;它是Model-View-Controller结构中的View。它只是显示东西。你的视图控制器是控制器;它是完成任务的人。

此时控制器也不需要咨询视图,因为视图一开始就不应该存储任何重要数据。数据是模型,在此之前应该已经被控制器检索和存储了。

【讨论】:

在这里查看我对模型-视图-控制器的完整讨论:apeth.com/iosBook/ch13.html#_model_view_controller

以上是关于UIView 的 viewDidDisappear的主要内容,如果未能解决你的问题,请参考以下文章

UIViewController 的 viewDidAppear/viewDidDisappear:应该在啥时候调用这些方法?

viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear 指南

viewDidDisappear 未调用

iOS 在调用完成块之前会在 viewDidDisappear 之后等待 CATransaction

点击 UITabBar 时未调用子视图控制器的 viewDidDisappear

在 MPMoviePlayerController 中进入全屏调用 viewWillDisappear 和 viewDidDisappear