首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否强制iphone应用程序以编程方式重新启动?

是否强制iphone应用程序以编程方式重新启动?
EN

Stack Overflow用户
提问于 2010-12-09 23:02:00
回答 7查看 80.9K关注 0票数 51

我正在尝试让我的iPhone应用程序在按下注销按钮时以编程方式重新启动。

有没有人有要分享的代码样本?我读到可以通过修改main.m文件来实现,但我找不到任何与此相关的代码。

任何帮助都将不胜感激。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-12-10 00:46:28

首先,虽然有可能强行杀死你的应用程序,但这是苹果不允许的,并将被拒绝。即使它没有被拒绝,一旦它被杀死,也没有办法重启你的应用程序。正如Jason Coco所说,你只需要找到一些方法来通过你的代码重置你的应用程序。这可能是更多的工作,但这是值得的,因为它不会被苹果拒绝。

票数 20
EN

Stack Overflow用户

发布于 2012-11-11 20:06:30

备注:

虽然这已经被回答为“不可能”,但我认为这是一个新的iOS开发人员应该问的问题,他们可以做一些事情,这可能就是他们想要的。

从用户的角度来看,有一种方法可以“重启”你的应用程序,而不是从技术上重启或退出iOS应用程序。正如其他答案所指出的那样,iOS应用程序永远不应该显式退出,因为这在iOS上是不允许的。

我的答案:

如果你想让你的应用程序回到启动时的状态,这不是100%可能的,但我会解释一种方法,它应该足以满足所有有效的目的。

要做的第一件事是重新创建根视图控制器。我建议在应用程序委托中的方法中这样做:

代码语言:javascript
运行
复制
- (void)resetAppToFirstController
{
    self.window.rootViewController = [[MyMainViewController alloc] initWithNibName:nil bundle:nil];
}

在许多情况下,这将是足够的,但您拥有的任何应用程序状态也应该在此方法中重置。例如,注销用户,重置任何非持久状态,以及使所有对象无效(释放)。此方法还可用于从application:didFinishLaunchingWithOptions初始创建第一个视图控制器。

框架类和单例:

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

代码语言:javascript
运行
复制
[UIApplication sharedApplication];
[NSNotificationCenter defaultCenter];
[NSUserDefaults standardUserDefaults];
[UIScreen screens];
// etc...

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

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

就用户而言,上述操作应该足以“重置”您的应用程序。如果你想作为你的第一个视图控制器,你甚至可以再次显示闪屏。

票数 66
EN

Stack Overflow用户

发布于 2012-01-05 02:20:49

试试这个,它对我很管用。

代码语言:javascript
运行
复制
-(void)restart
{
    MyAppDelegate *appDelegate = (MyAppDelegate *)([UIApplication sharedApplication].delegate);
    [appDelegate.navigationController popToRootViewControllerAnimated:NO];
    UIViewController *topViewController = appDelegate.navigationController.topViewController;
    Class class = [topViewController class];
    NSString *nibName = topViewController.nibName;
    UIViewController *rootViewcontroller = (UIViewController *)([[class alloc] initWithNibName:nibName bundle:nil]);
    [appDelegate.navigationController.view removeFromSuperview];
    appDelegate.navigationController.viewControllers = [NSArray arrayWithObject:rootViewcontroller];
    [appDelegate.window addSubview:appDelegate.navigationController.view];
    [appDelegate.window makeKeyAndVisible];
}
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4399611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档