在后台运行一段时间后将应用程序置于前台时,iOS黑屏

时间:2019-02-28 16:10:37

标签: ios swift background foreground

我正在尝试从我们的iOS应用中删除所有故事板,因为与Git一起工作时,它们会造成很大的混乱。

我现在在AppDelegate的application(_:didFinishLaunchingWithOptions:)方法中设置初始ViewController:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    window = UIWindow(frame: UIScreen.main.bounds)
    let launchViewController = LaunchView()
    window!.rootViewController = launchViewController
    window!.makeKeyAndVisible()

    [...]

    return true
}

LaunchView是一个简单的视图控制器,负责根据用户是否登录将其路由到登录屏幕或主屏幕。

在此之前,LaunchView在Main.storyboard中设置为初始。

我已经从Info.plist文件中删除了以下几行:

<key>UIMainStoryboardFile</key>
<string>Main</string>

一切正常,除了当我们将应用程序在后台放置几个小时而没有强制退出(我不确定需要多少时间来重现该代码)然后将应用程序返回到前台时,显示全黑屏幕,好像根控制器消失了。而且我们必须杀死该应用程序,然后再次重新打开它才能使用它。

这让我发疯,因为它真的很难复制,因为如果仅将应用程序留在后台几分钟,它就可以正常工作。 我怀疑这与应用程序的暂停状态有关,但我不太确定。

您知道问题可能在哪里吗?

谢谢!

编辑

也许这与问题有关: 在LaunchView上,我使用以下代码将用户发送到主屏幕(如果他已登录):

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }

let rootVC = UIStoryboard.main.rootViewController
if let snapshot = appDelegate.window?.snapshotView(afterScreenUpdates: true) {

    rootVC.view.addSubview(snapshot);
    appDelegate.window?.rootViewController = rootVC

    UIView.transition(with: snapshot, duration: 0.4, options: .transitionCrossDissolve, animations: {
        snapshot.layer.opacity = 0;
    }, completion: { (status) in
        snapshot.removeFromSuperview()
    })
}
else {
    appDelegate.window?.rootViewController = rootVC
}

iOS是否有可能在某个时候删除rootViewController?

1 个答案:

答案 0 :(得分:-1)

事实证明,该问题与交换window的{​​{1}}时涉及快照的过渡效果有关。

我删除了过渡效果,只是更改了rootViewController。现在一切正常!

在代码中,我对此进行了更改:

rootViewController

对此:

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }

let rootVC = UIStoryboard.main.rootViewController
if let snapshot = appDelegate.window?.snapshotView(afterScreenUpdates: true) {

    rootVC.view.addSubview(snapshot);
    appDelegate.window?.rootViewController = rootVC

    UIView.transition(with: snapshot, duration: 0.4, options: .transitionCrossDissolve, animations: {
        snapshot.layer.opacity = 0;
    }, completion: { (status) in
        snapshot.removeFromSuperview()
    })
}
else {
    appDelegate.window?.rootViewController = rootVC
}

谢谢大家的帮助!我希望这个答案对其他人有用。