我想將用戶分流回應用程序(第一個視圖控制器)的初始「啓動畫面」,以便應用程序可以有效「重置」並在離線模式下運行。從應用程序中的任意點「展開」到特定視圖控制器
通常情況下,我會使用unwind segue將用戶推回到特定的視圖控制器,但是需要從故事板中明確創建展開的segue(如果我理解正確)。我需要從應用程序的任何位置有效地放鬆身心,我不希望爲所有幾十個視圖控制器添加unwind segues。
有沒有辦法做到這一點編程?你可以創建一個放鬆的繼續?
我的第一次嘗試是在應用程序的「頂部」UIViewController上遞歸調用dismiss
。它在技術上有效,但感覺像是一個雜湊,在屏幕上看起來不太好,並且在每個彈出的連續視圖控制器上調用viewDidAppear
時會產生各種問題。這是它的代碼。
extension UIApplication {
var topController: UIViewController? {
var topController = keyWindow?.rootViewController
while topController?.presentedViewController != nil {
topController = topController?.presentedViewController
}
return topController
}
// Recursively dismiss until some condition is met
func dismiss(until: @escaping ((UIViewController?)->Bool), completion: (()->Void)?) {
var proxy: (()->Void) = { }
let doDismiss: (()->Void) = {
if !until(self.topController) {
DispatchQueue.main.async {
self.topController?.dismiss(animated: false, completion: proxy)
}
} else {
completion?()
}
}
proxy = doDismiss
doDismiss()
}
}
,這就是所謂像:
UIApplication.shared.dismiss(until: { (topController) -> Bool in
return topController is SplashScreenViewController
}, completion: nil)
是否有一個簡單的解決方案?