ios - 如何 "restart"iOS 应用程序/从 UIApplicationDelegate 实例重新实例化初始 View Controller ?

标签 ios objective-c uiapplicationdelegate

我的第一个 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/

相关文章:

iphone - 第一个 View 的 ViewDidAppear 中的第二个 View 调用,检查 plist 是否存在

ios - 转换 HH :MM:SS to seconds in xcode

c# - 在多线程中更新 UI 的最佳方法是什么

iphone - 我应该什么时候释放 [[UIApplication sharedApplication] delegate] 对象?

ios - 使用 Copy In 从其他 iOS 应用程序接收文件

ios - 由于方法调用,Tableview 滚动速度变慢

ios - 使用 xcodebuild -exportArchive(Xcode8.3,自动签名)时如何获取分发应用程序?

ios - UIButton以编程方式获取默认突出显示样式

ios - 删除单元格导致崩溃

ios - Xcode 8 无法存档 "Command/usr/bin/codesign failed with exit code 1"