【问题标题】:Can viewWillDisappear be called directly?可以直接调用 viewWillDisappear 吗?
【发布时间】:2015-02-19 20:21:30
【问题描述】:

对于为什么不应直接调用诸如“viewWillDisappear”之类的方法,是否有人有官方参考?关于这个主题有几个现有的帖子,但没有官方链接,只有意见。

这样做是没有意义的,因为它从视图的生命周期管理中调用了“不循环”的方法。当然,它们可以并且在许多情况下被覆盖。

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/RespondingtoDisplay-Notifications/RespondingtoDisplay-Notifications.html

问题在于我遇到的一些代码是从某个方法调用“viewWillDisappear”的。真正需要调用的是'viewWillDisappear'方法的内容。

例子:

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    // The following two methods are the ones that need to be called below
    [self someMethod];
    [self anotherMethod];
}

- (void)delegateMethod
{
    [self viewWillDisappear:YES];
    // Do some other work
    // View is moved off-screen, not deallocated, and therefore, does not "disappear"
}

本能地,直接调用任何视图层次结构方法(例如 viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear)似乎是错误的。如果你告诉“self”和“super”视图 viewWillDisappear 它可能会在框架中做一些事情,这可能会在以后导致问题。我认为这些方法应该只由框架调用。但是,这是我的观点,不是官方消息来源。头文件似乎没有提供任何相关信息。

任何帮助表示赞赏。

【问题讨论】:

  • 如果您正确删除视图,则没有必要。您可以在要从父视图中添加和删除此视图的位置添加代码吗?确保您阅读了以下内容:developer.apple.com/library/ios/featuredarticles/… 特别是“实现自定义容器视图控制器”部分
  • 不幸的是,代码太长,无法发布(不是我写的)。它本质上是添加到导航控制器中的。视图永远不会被删除。它根据需要滑入/滑出。
  • 仅供参考 [self viewWillDisappear]; 应该是 [self viewWillDisappear:YES];[self viewWillDisappear:NO]; ...但无论如何以这种方式使用 viewWillDisappear 是没有意义的...

标签: ios viewcontroller


【解决方案1】:

没有技术原因你不能。

但你不应该。

这是一种糟糕的编码习惯,你可能会让读者感到困惑,或者更糟的是,让他/她不信任你。

良好的编码习惯如下:

- (void)delegateMethod
{
  [self doCommonWork];
}

- (void)viewWillDisappear:(BOOL)animated 
{
  [self doCommonWork];
}

- (void)doCommonWork 
{
  // …
}

【讨论】:

  • 我同意这是不好的编码习惯,出于这些原因。代码对我来说很快就脱颖而出。我不知道我们是否可以确定没有副作用,因为我不知道“[super viewWillDisappear:animated];”是什么确实在做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多