viewWillAppear方法中是否必须包含[super viewWillAppear]这个方法?(涉及IT技术)

3

我将iAd/AdMob广告的代码放在了...

-(void)viewWillAppear:(BOOL)animated{}

我目前在所有iOS设备上使用的广告已经完美地工作了。

当我将我的iPhone连接到Xcode并点击Product -->Analyze时,会出现以下信息:

UIViewController子类'iPhoneSIX'中的viewWillAppear:实例方法缺少[super viewWillAppear:]调用。

我刚刚偶然发现了这个Product-->Analyze的东西。即使当前一切都正常,我真的需要添加[super viewWillAppear]吗?如果我不关注Product-->Analyze问题导航,苹果会拒绝我的应用程序吗?

另外,这是什么意思...

[super viewWillAppear:YES];

调用这个函数会做什么?
3个回答

12

根据苹果:(我强调)

在将接收者的视图添加到视图层次结构之前,以及在为显示视图配置任何动画之前,将调用此方法。您可以重写此方法以执行与显示视图相关的自定义任务。例如,您可以使用此方法更改状态栏的方向或样式,以与正在呈现的视图的方向或样式协调。如果您重写此方法,则必须在实现中的某个时候调用super。


7

苹果公司在决定接受或拒绝您的应用程序时并不会过于具体。 它只遵循指南,这些指南并没有涉及您特定方法的细节。

调用[super viewWillAppear:YES]是最佳实践,我建议您这样做。始终包含super可以确保在执行任何其他代码之前调用超级类中的任何代码。因此,如果您或其他人编码了一个期望执行某些代码的超类,则保证仍然执行它,而不仅仅是在子类中覆盖整个方法。

假设您有一个名为MyViewController的视图控制器,它是UIViewController的子类。然后假设您有另一个名为MyOtherViewController的视图控制器,它是MyViewController的子类。现在在MyOtherViewController中的viewWillAppear中编写一些内容。如果先调用super,则会在执行任何代码之前调用MyViewController中的viewWillAppear。如果MyViewController中的viewWillAppear先调用super,则在执行任何代码之前将调用UIViewController中的viewWillAppear


尽可能地,您应该始终将参数传递给覆盖方法时所提供的值,而不是像 YES 这样的具体值,除非您有非常明确的原因这样做。 因此,[super viewWillAppear:animated] 将是最佳实践。 - devios1

0

我非常确定苹果不会因为未在重写的方法上调用super而拒绝您的应用程序,主要是因为有些情况下您可能特别想避免调用super

话虽如此,正如Josh Gafni所提到的,这绝对是最佳实践,除非您有非常好的理由不这样做。还要记住,一些视图控制器子类(无法具体回忆哪些,但可能是UICollectionViewController)只有在适当地调用其视图生命周期方法时才能正常工作,因此不调用super肯定会破坏某些类(有时以您可能没有意识到的微妙方式)。

因此,我的建议是添加对super的调用(通常作为方法中的第一行),看看事情是否继续正常工作。如果不行,请花点时间尝试了解发生了什么不同,并看看是否可以以不同的方式解决它。通常情况下,您应该始终(作为习惯)在覆盖任何视图生命周期方法时提供对super的调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接