App Delegate - 卸载视图控制器

时间:2010-10-27 09:34:02

标签: iphone uiviewcontroller

我正试图在iPhone进入睡眠状态时从视图中卸载视图控制器。我的应用程序有一个秒表,当手机进入睡眠或来电或用户关闭应用程序而不退出时,它必须继续计数。

我有所有这些功能,我正在捕捉所有开始时间和停止时间,并在重新进入秒表视图控制器时,我计算差异。一切都很美妙。当我做一些额外的测试时,我意识到我没有迎合iPhone进入睡眠模式。

所以我需要做的就是确保我的秒表是正确的,将用户带回应用程序主屏幕。我知道当应用程序进入休眠状态时会调用以下方法:

-(void)applicationWillResignActive:(UIApplication *)application

如何从我的应用代表中卸载秒表视图控制器?

----更新----

kpower,感谢您的反馈。我已经实现了以下代码:

在我的App代表中:

- (void)applicationWillResignActive:(UIApplication *)application
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"AppIsAsleep" object:nil];
}

在我的视图控制器中,我有以下内容:

-(void)viewDidLoad 
{   
    // Add Observer.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewDidUnload:) name:@"AppIsAsleep" object:nil];
}

- (void)viewDidUnload {
    //Remove the Observer.
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"AppIsAsleep" object:nil];
}

当手机进入睡眠状态时,它实际上会关闭应用程序,我做错了吗?

此致 斯蒂芬

1 个答案:

答案 0 :(得分:1)

您可以使用通知机制。它允许您从不同的地方(不是AppDelegate)卸载视图控制器。

例如,在视图控制器的viewDidLoad方法中添加一个观察者(不要忘记在viewDidUnload中删除它),在AppDelegate的applicationWillResignActive:方法中,您只需发布通知。就是这样。

<强>↓更新这里↓

当您收到通知时 - 您应该自行管理视图控制器的删除。并且在这里调用viewDidUnload不是解决方案,因为在视图控制器已经卸载并且不会导致删除之后调用此方法。

如何删除?取决于视图控制器的添加方式(例如,popViewControllerAnimated用于UINavigationController)。这里的主要思想是使对象的保留计数等于0(因为你知道这种情况会破坏一个对象) - 所以你应该发送必要的释放消息。