2

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

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

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

4

1 回答 1

7

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

AppDelegate.h:

- (void) resetApp;

AppDelegate.m:

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

    _window.rootViewController = controller;
}

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

应用委托。迅速 (因为它是 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”)

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

于 2013-10-30T04:42:32.020 回答