1

我想將用戶分流回應用程序(第一個視圖控制器)的初始「啓動畫面」,以便應用程序可以有效「重置」並在離線模式下運行。從應用程序中的任意點「展開」到特定視圖控制器

通常情況下,我會使用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) 

是否有一個簡單的解決方案?

回答

0

對不起,你不能在代碼本身創建任何類型的segue,他們必須在故事板中設置。

你如何實現你想要的並返回到初始視圖控制器取決於你如何設置你的控制器層次結構。例如,如果你使用的是UINavigationController,並且所有的視圖控制器都被壓入了它,那麼你可以使用popToRootViewController(animated:Bool)。除此之外的任何內容都將取決於您,但您可能必須手動處理它。

您可能需要重新考慮視圖控制器層次結構。

相關問題