web-dev-qa-db-ja.com

Swift-ルートに戻るためにすべてのView Controllerを閉じる方法

ユーザーが必要とするたびに、アプリが最初のView Controllerにアクセスできるようにします。

そのため、Navigation Controllerにプッシュされるか、モーダルで表示されるか、何でもメソッドを開くかどうかに関係なく、すべてのView Controllerを閉じる関数を作成したいと思います。

さまざまな方法を試しましたが、すべてのView Controllerを確実に削除できませんでした。簡単な方法はありますか?

38
Byoth

これを試して :

self.view.window?.rootViewController?.dismiss(animated: true, completion: nil)

ルートView Controllerより上のすべてのView Controllerを閉じる必要があります。

それでもうまくいかない場合は、このようなwhileループを実行して手動で行うことができます。

func dismissViewControllers() {

    guard let vc = self.presentingViewController else { return }

    while (vc.presentingViewController != nil) {
        vc.dismiss(animated: true, completion: nil)
    }
}

PresentingControllerを取得するまで、すべてのviewControllerを閉じます。

編集:使用できるプッシュされたViewControllerを閉じる/ポップする場合

self.navigationController?.popToRootViewController(animated: true)

それが役に立てば幸い。

49
Agent Smith

ナビゲーションを使用している場合は、最初のナビゲーションを使用するか、モーダルでプレゼンテーションを行う場合は2番目のナビゲーションを使用できます。

ナビゲーション用

self.navigationController?.popToRootViewController(animated: true)

モーダルプレゼンテーション用

self.view.window!.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
21
Sandip Gill

rootViewControllerを提示する場合は、ViewControllerを削除するように依頼してください。

if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
   appDelegate.window?.rootViewController?.dismiss(animated: true, completion: nil)
   (appDelegate.window?.rootViewController as? UINavigationController)?.popToRootViewController(animated: true)
}
13

みなさん、こんにちはSwift-4の答えです。

ルートView Controllerに戻るには、コードを1行呼び出すだけで作業が完了します。

 self.view.window?.rootViewController?.dismiss(animated: true, completion: nil)

スプラッシュ画面があり、その後ログイン画面があり、ログイン画面に移動したい場合は、上記のコードにpresentedviewcontrollerを追加するだけです。

self.view.window?.rootViewController?.presentedViewController!.dismiss(animated: true, completion: nil)
10
ap00724
 func  dismiss_all(view: UIView){
   view.window!.rootViewController?.dismiss(animated: true, completion: nil)

 }
2
Softlabsindia

このコードを使用して、表示されたViewControllerを閉じ、ナビゲーションに移動しますrootviewcontroller Swift 4

// MARK:- Dismiss and Pop ViewControllers
func dismissPopAllViewViewControllers() {
    if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
        appDelegate.window?.rootViewController?.dismiss(animated: true, completion: nil)
        (appDelegate.window?.rootViewController as? UINavigationController)?.popToRootViewController(animated: true)
    }
}
2
Faris Muhammed

アンワインドセグエの作成https://developer.Apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/ UsingSegues.html Apple Inc.の著作権)

巻き戻しセグエを使用すると、表示されているView Controllerを閉じることができます。 Interface Builderでボタンまたは他の適切なオブジェクトを現在のView ControllerのExitオブジェクトにリンクすることにより、アンワインドセグエを作成します。ユーザーがボタンをタップするか、適切なオブジェクトと対話すると、UIKitは、巻き戻しセグエを処理できるオブジェクトをView Controller階層で検索します。次に、現在のView Controllerと中間View Controllerを閉じて、巻き戻しセグエのターゲットを明らかにします。

アンワインドセグエを作成するには

  1. 巻き戻しセグエの終わりに画面に表示されるView Controllerを選択します。

  2. 選択したView Controllerで巻き戻しアクションメソッドを定義します。

このメソッドのSwift構文は次のとおりです。

@IBAction func myUnwindAction(unwindSegue: UIStoryboardSegue)

このメソッドのObjective-C構文は次のとおりです。

- (IBAction)myUnwindAction:(UIStoryboardSegue*)unwindSegue

3.巻き戻しアクションを開始するView Controllerに移動します。

  1. 巻き戻しセグエを開始するボタン(または他のオブジェクト)をControlキーを押しながらクリックします。この要素は、非表示にするView Controller内にある必要があります。

  2. View Controllerシーンの上部にあるExitオブジェクトにドラッグします。

https://developer.Apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/Art/segue_unwind_linking_2x.png

  1. 関係パネルからアンワインドアクションメソッドを選択します。

Interface Builderで対応するアンワインドセグエを作成する前に、View Controllerの1つでアンワインドアクションメソッドを定義する必要があります。そのメソッドの存在は必須であり、アンワインドセグエの有効なターゲットがあることをInterface Builderに伝えます。

1
Srinath Shah

ルートView Controllerを除くスタック上のすべてのView Controllerをポップし、表示を更新します。

func popToRootViewController(animated: Bool)

ただし、特定のコントローラーに移動する場合は、以下の機能を使用します。

func popToViewController(UIViewController, animated: Bool)

指定されたView ControllerがNavigation Stackの最上位になるまでView Controllerをポップします。

1
Shauket Sheikh

あなたが探しているのは、セグエをほどくことです。

セグエの巻き戻しは、プッシュ、モーダル、ポップオーバー、およびその他のタイプのセグエを介してナビゲーションスタックを「巻き戻す」方法を提供します。巻き戻しセグエを使用して、ナビゲーション階層の1つ以上のステップを「戻る」ことができます。

ドキュメントへのリンク: https://developer.Apple.com/library/archive/technotes/tn2298/_index.html

0
Srinath Shah

目的を達成するには、ナビゲーションスタックを変更してから、popViewControllerを実行します。

let allControllers = NSMutableArray(array: navigationController!.viewControllers)
let vcCount = allControllers.count
for _ in 0 ..< vcCount - 2 {
    allControllers.removeObject(at: 1)
}
// now, allControllers[0] is root VC, allControllers[1] is presently displayed VC. write back to nav stack
navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false)
// then pop root VC
navigationController!.popViewController(animated: true)

ナビゲーションスタックをさらに操作する方法については、 this を参照してください。最上部のVCがモーダルの場合、上記のコードの前に最初にそれを閉じます。

0
beshio