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

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

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

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

【问题讨论】:

    标签: ios objective-c uiapplicationdelegate


    【解决方案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]];
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多