如何从 UIApplicationDelegate 实例“重新启动”iOS 应用程序/重新实例化初始视图控制器?

Posted

技术标签:

【中文标题】如何从 UIApplicationDelegate 实例“重新启动”iOS 应用程序/重新实例化初始视图控制器?【英文标题】:How to "restart" iOS app / re-instanciate inital view controller from UIApplicationDelegate instance? 【发布时间】:2013-10-30 04:37:43 【问题描述】:

我的第一个 ios 应用(实用程序)版本即将完成,但仍有一个问题:应用运行自动化序列。在大多数其他平台上,该序列将完成/失败/取消,然后是清理并退出(x)。

我意识到我的 iOSapp 不应该退出(),所以它返回到 UIApplicationDelegate 执行清理;将所有控制器设置为零(使用 ARC),只留下 appDelegate 实例。 然后应用程序应该重新实例化初始视图控制器,有效地再次启动应用程序。

来自 UIApplicationDelegate 的调用是什么?我希望它应该与 iOS 在初始故事板应用程序启动时调用的相同。

【问题讨论】:

【参考方案1】:

您应该在应用程序委托类中定义一个(公共)方法,并在必要时调用它。在该方法中,您应该重新实例化初始视图控制器并将其设置为 UIWindow 实例的根视图控制器(您应该有一个 ivar)。

AppDelegate.h:

- (void) resetApp;

AppDelegate.m:

- (void) resetApp 
    TopViewController* controller = [[TopViewController alloc] init];

    _window.rootViewController = controller;


编辑:如果您使用情节提要,则此代码有效:

AppDelegate.swift (因为现在是 2017 年):

func resetApp() 
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    guard let newRoot = storyboard.instantiateInitialViewController() else 
        return // This shouldn't happen
    
    self.window?.rootViewController = newRoot

(假设您的应用程序的初始情节提要 - Info.plist 中指定的情节 - 称为“Main.storyboard”)

如果您的应用的设计方式是在发生此重置时可能正在进行长时间或异步操作,则应采取其他措施来处理它们。对于初学者,所有未实现为单例或由此类长寿命对象保留的视图控制器都可能会被释放。

【讨论】:

另外,您可以通过手动调用 -application:didFinishLaunchingWithOptions: 来“伪造”应用程序启动,但我不认为它应该这样使用,所以它有点错误。 啊,rootViewController.... 这听起来不错,但由于故事板功能,我没有使用它。 哦,对不起...我对故事板的了解为 0,我在代码中做所有事情:( 不,没关系。你的解决方案看起来不错,我会试试的。谢谢。 注意:-[UIWindow setRootViewController:] 从 4.0 开始可用。在此之前,你会使用类似:[_window addSubview:[controller view]];

以上是关于如何从 UIApplicationDelegate 实例“重新启动”iOS 应用程序/重新实例化初始视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UIApplicationDelegate 添加到 UIResponder 链的末尾?

为啥从 UIApplicationDelegate 获取 ManagedObjectContext 的 Apple 文档不好?

UIApplicationDelegate 在 Swift 应用程序中没有名为 managedObjectContext 的成员

如何在整个程序中使用 UIApplicationDelegate?

尝试设置窗口出口时,从两个 UIApplicationDelegate 实现中提取公共超类会导致崩溃

无法使用 [UIApplication sharedApplication]。如何在 UIApplicationDelegate 之外注册通知?