1

ユーザーをアプリの最初の「スプラッシュ画面」(最初のビューコントローラ)に戻して、アプリを効果的に「リセット」できるようにしたいオフラインモードで動作します。アプリ内の任意の点から特定のビューコントローラに「巻き戻す」

通常、ユーザーを特定のView Controllerにプッシュバックするために巻き戻しセグを使用しますが、ストロークボードから明示的に作成する必要がある場合は、巻き戻しセグを正しく理解する必要があります。私は効果的にアプリケーションの任意の時点から巻き戻しを行う必要があり、私は何十ものビューコントローラのすべてに巻き戻しセグを追加したくありません。

プログラムでこれを行う方法はありますか?あなたは即座にリラックスセグを作ることができますか?

私の最初の試みは、アプリケーションの "トップ" 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

申し訳ありませんが、コード自体にセグエを作成することはできません。ストーリーボードにセットアップする必要があります。あなたが望むものを達成し、初期ビューコントローラに戻す方法

は、セットアップあなたのコントローラの階層構造を持っているかに依存します。たとえば、UINavigationControllerを使用していて、すべてのView Controllerがプッシュされている場合は、popToRootViewController(animated:Bool)を使用できます。それ以外のものは依存しますが、おそらく手動で処理する必要があります。

あなたはあなたのビューコントローラの階層の構造を再考する必要がある場合があります。

関連する問題