iphone - 如何重新启动我的 iPhone 应用程序

标签 iphone objective-c ipad application-restart

<分区>

Possible Duplicate:
Force iphone app to restart programmatically

如何以编程方式重新启动/重新打开我的 iphone/iPad 应用程序

最佳答案

注意:

虽然这已被否决,但我认为对于新的 iOS 开发人员来说,这是一个非常有效的问题。有一种方法可以从用户的角度“重新启动”您的应用程序,技术上这不是重新启动或退出 iOS 应用程序。正如其他答案所指出的那样,iOS 应用程序永远不应明确退出,因为这在 iOS 上是不允许的。

我的答案:

如果您希望您的应用恢复到启动时的状态,这不是 100% 可能的,但我将解释一种方法来实现大部分状态,这应该足以满足所有有效目的。

首先要做的是重新创建 Root View Controller 。我建议从应用程序委托(delegate)中的方法执行此操作,如下所示:

- (void)resetAppToFirstController
{
    self.window.rootViewController = [[MyMainViewController alloc] initWithNibName:nil bundle:nil];
}

在许多情况下这就足够了,但是您拥有的任何应用程序状态也应该在此方法中重置。例如注销用户,重置任何非持久状态,并尽可能取消(释放)所有对象。此方法还可用于从 application:didFinishLaunchingWithOptions 初始创建您的第一个 View Controller 。

框架类和单例:

您将无法完全重置任何框架单例或每个应用程序实例的状态,例如:

[UIApplication sharedApplication];
[NSNotificationCenter defaultCenter];
[NSUserDefaults standardUserDefaults];
[UIScreen screens];
// etc...

这可能没问题,因为无论如何您都不应该在其中存储任何非持久状态(NSNotificationCenter 除外,但在对象被释放时,所有已注册的观察者都应该被删除)。如果您确实想要初始化或重置任何框架状态,您可以在相同的 resetAppToFirstController 方法中进行。无论如何,应该没有必要重新创建这些,或者 window 对象。

如果您有任何自己的单例,您可以通过将它们存储在单例持有类(它本身就是一个真正的单例)中来重新创建它们。从概念上讲,这是一个简单的单例类,具有每个其他单例的属性和一个 reset 方法来取消和释放它们。您的其他单例应该使用此类(而不是静态或全局变量)来存储单例实例。如果您使用任何第三方库,请小心,因为它们也可能使用单例,您需要确保它们也使用您的单例持有者,以便您可以根据需要重置它们。我认为这种技术无论如何都是很好的做法,因为在某些情况下(例如单元测试)您确实希望通常是单例的对象消失并重新初始化为原始状态。但是,您不想将单例实现与单例持有者耦合,因此实现此目的的一个好方法是使用 NSMutableDictionary 作为 [UIApplication sharedApplication]< 上的关联对象 以单例类名作为键。但是,我有点跑题了,因为这是一种超出这个问题范围的更高级的技术。


就用户而言,以上内容足以“重置”您的应用程序。如果你想作为你的第一个 View Controller ,你甚至可以再次显示启动画面。

关于iphone - 如何重新启动我的 iPhone 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13330353/

相关文章:

iphone - 关于此应用程序使用何种导航的指南

objective-c - NSTextView 在没有停靠图标的应用程序中没有响应

ios - NSURL 中的多个参数

ios - 使用 touchesBegan 加速元素 : and touchesEnded:

ipad - iOS 4.2 模拟器文件?

iphone - TableView Custom Cell中添加Radio Button外部无法访问

iphone - 在 UIWebView 中打开弹出链接,可能吗?

ios - UIActivityViewController Gmail 共享主题和正文变空了吗?

iphone - 为什么APNS需要Entrust ssl证书的ssl

IOS boost asio 从 ipv6 网络连接