iPhone:viewDidDisappear的正确使用方式是什么?

13

我对Objective C还很陌生,关于viewDidDisappear,我有一个问题。我的应用程序使用AVAudioPlayer播放声音,当视图切换时,我想停止声音。

如果我在我的视图控制器实现中这样做:

- (void)viewDidDisappear:(BOOL)animated {
    [self.audioPlayer stop];
}

它运行良好。但是我脑海中的小程序员认为我没有正确使用它。我非常确定你应该使用一个布尔变量来调用viewDidDisappear,而不仅仅是指定(BOOL)animated;此外,在我的视图切换中加入一些动画效果会很好......不过,这可能是完全不同的讨论!

那么,我做错了什么,如何正确使用它?我必须将调用链接到按钮操作吗?在哪里才能正确声明函数本身? 谢谢。

4个回答

19

我非常广泛地实现了viewDidDisappear:(BOOL)animated,以及viewWillAppearviewWillDisappearviewDidAppear。 实现此方法的主要原因是在事件发生时使您的视图控制器执行某些操作,例如viewDidDisappear。 您不调用此方法,但您的应用程序将调用您的视图控制器来执行其中实现的操作。 由于这是一个继承方法,只要确保从超类中继承的所有实现都可以完成,那么实现viewDidDisappear就很好了。 因此,我建议您将代码更改为以下内容:

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:(BOOL)animated];    // Call the super class implementation.
    // Usually calling super class implementation is done before self class implementation, but it's up to your application.

    [self.audioPlayer stop];
}

11

- (void)viewDidDisappear:(BOOL)animated 是一个方法声明,而不是任何调用。这个方法会在UIKit操作视图控制器时被调用;除非你正在编写自己的代码来直接操纵它们控制的视图使视图控制器出现和消失(例如,如果你正在重写UINavigationController),否则不需要自己调用它。

不过,你可能做错了一些事情:你必须在你的实现中的某个地方调用[super viewDidDisappear:animated],否则会导致出现问题。


所以我想我大致上理解了,谢谢!不过,你能否详细说明一下 [super viewDidDisappear:animated] 的调用?我对整个 super 的业务还不是完全了解... 我目前是一个编码危险 :p 如果我省略它会发生什么? - seeafish

4

你脑海中的“小程序员”声音可能更习惯于过程式编码,即调用操作系统并告诉它该做什么。Cocoa Touch使用事件驱动范例,其中你的程序有一些例行程序(方法),当操作系统(框架)准备好时会调用它们之一。viewDidDisappear就是这些例行程序之一。只需耐心等待操作系统调用它(假设你已经正确设置了所有内容)。


是的... PHP 是我的强项,我必须说我刚开始掌握正确的面向对象编程和整个MVC架构。然而,在这种情况下,当视图消失时,我实际上需要应用程序执行某些操作。这难道不需要告诉我的视图使用viewDidDisappear来完成吗? - seeafish
@capitales:不是的,相反的。你不需要告诉视图什么时候消失,而是当视图消失时,操作系统会通知你。 - hotpaw2
1
哇...Objective-C 知道功夫!我想我有点明白你的意思。但是按照逻辑,我应该能够以某种方式检查 viewDidDisappear,然后操作系统会回答“是的,它消失了”,对吗? - seeafish
@capitales7:操作系统在调用viewDidDisappear时会告诉你,“是的”,它已经消失了。你必须等待它告诉你。(你可以在它告诉你时设置一个标志。) - hotpaw2

2

viewDidDisappear: 是一个可选方法,您的视图可以利用它在视图确实消失时执行自定义代码。您不需要在视图中拥有此方法,您的代码几乎永远不需要调用它。


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