当我的 UIViewController 被弹出时调用的方法?

Posted

技术标签:

【中文标题】当我的 UIViewController 被弹出时调用的方法?【英文标题】:Method called when my UIViewController gets popped? 【发布时间】:2011-05-11 15:47:17 【问题描述】:

我有一个 UIViewController 驻留在 UINavController 中。通过 AVAudioPlayer 播放音频的视图控制器。当它弹出时,它会继续播放音频,即使在 dealloc 方法中我释放了音频播放器。我什至尝试将音频播放器设置为停止/暂停,然后在 dealloc 中释放它,但它不起作用。

所以,

    为什么弹出 UIViewController 时不调用 dealloc? 在弹出控制器之前/之后,我应该使用什么方法来停止音频播放器。

编辑:我不认为我的视图控制器被保留在其他地方。这是我分配它并将其推送到导航控制器时的代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    NSString *name = [tableData objectAtIndex:[indexPath row]];
    ToquesDetailVC *toqueDetail = [[ToquesDetailVC alloc] initWithNibName:@"ToquesDetail"
                                                                audioPath:[[NSBundle mainBundle] pathForResource:name ofType:@"mp4"]
                                                               imageNamed:[[NSBundle mainBundle] pathForResource:name ofType:@"jpg"]];
    [[self navigationController] pushViewController:toqueDetail animated:YES];
    [toqueDetail release];

【问题讨论】:

你确定你的视图控制器(被弹出的那个)没有被保留在其他地方吗? 不,我很确定。我更新了我的问题代码。感谢您的回复。 【参考方案1】:

关于第 (2) 点,您是否尝试过:

- (void)viewDidDisappear:(BOOL)animated

在您的视图控制器子类上知道它何时“消失”?

【讨论】:

如果您将另一个控制器推到它上面,它也会消失。如果可以,那么您不知道它是弹出还是下推。 没错,如果你说推送一个模态视图控制器;但应该可以在这样的事件之后检查音频(在这个问题中)是否仍然应该播放。我承认这不是一个理想的钩子,因为您有几种情况会导致视图消失。好点子。【参考方案2】:

导航控制器确实释放了视图控制器,但由于您保留了它(使用 initwithnibname 调用 toqueDetail),并且它是自动释放的,因此在运行循环完成之前它不会被释放。您必须要么不使用便利初始化程序,要么明确清除自动释放池。

【讨论】:

【参考方案3】:

您是否分配了音频播放器委托,如果是,是否持有对 VC 的引用?实际存在问题的类的代码可能会帮助我们更快地解决这个问题。 o_O

【讨论】:

以上是关于当我的 UIViewController 被弹出时调用的方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何从导航堆栈中推送/弹出uiviewcontroller时收到警报

如果从navigationController弹出时会释放ViewController?

当键盘弹出时如何隐藏图像小部件?

键盘弹出时网页滚动[关闭]

从后台弹出时不调用 Fragment 的 onResume()

为啥当键盘弹出时我的 UIScrollView 滚动错误?