我的第一个 iOS 应用程序(实用程序)版本即将完成,但仍然存在一个问题:该应用程序运行一个自动序列。在大多数其他平台上,序列将完成/失败/取消,然后是清理和退出(x)。
我意识到我的 iOSapp 不应该 exit() 所以它返回到执行清理的 UIApplicationDelegate;将所有 Controller 设置为 nil(使用 ARC),只保留 appDelegate 实例。 然后应用程序应该重新实例化初始 View Controller ,有效地再次启动应用程序。
来自 UIApplicationDelegate 的什么调用会执行此操作?我希望它应该与 iOS 在初始 Storyboard应用程序启动时调用的相同。
最佳答案
您应该在您的应用程序委托(delegate)类中定义一个(公共(public))方法,并在必要时调用它。在该方法中,您应该重新实例化您的初始 View Controller 并将其设置为您的 UIWindow 实例的 Root View Controller (您应该有一个 ivar)。
AppDelegate.h:
- (void) resetApp;
AppDelegate.m:
- (void) resetApp {
TopViewController* controller = [[TopViewController alloc] init];
_window.rootViewController = controller;
}
编辑:如果您使用 Storyboard,则此代码有效:
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
}
(假设您的应用程序的初始 Storyboard - 在 Info.plist 中指定的 Storyboard - 称为“Main.storyboard”)
如果您的应用设计为在发生此重置时可能正在进行长时间或异步操作,则应考虑额外的注意事项来处理它们。对于初学者来说,所有未作为单例实现或由此类长期存在的对象保留的 View Controller 都可能会被释放。
关于ios - 如何 "restart"iOS 应用程序/从 UIApplicationDelegate 实例重新实例化初始 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19673955/