ユーザーが必要とするたびに、アプリが最初のView Controllerにアクセスできるようにします。
そのため、Navigation Controllerにプッシュされるか、モーダルで表示されるか、何でもメソッドを開くかどうかに関係なく、すべてのView Controllerを閉じる関数を作成したいと思います。
さまざまな方法を試しましたが、すべてのView Controllerを確実に削除できませんでした。簡単な方法はありますか?
これを試して :
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)
それが役に立てば幸い。
ナビゲーションを使用している場合は、最初のナビゲーションを使用するか、モーダルでプレゼンテーションを行う場合は2番目のナビゲーションを使用できます。
self.navigationController?.popToRootViewController(animated: true)
self.view.window!.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
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)
}
みなさん、こんにちは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)
func dismiss_all(view: UIView){
view.window!.rootViewController?.dismiss(animated: true, completion: nil)
}
このコードを使用して、表示された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)
}
}
アンワインドセグエの作成( 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を閉じて、巻き戻しセグエのターゲットを明らかにします。
アンワインドセグエを作成するには
巻き戻しセグエの終わりに画面に表示されるView Controllerを選択します。
選択したView Controllerで巻き戻しアクションメソッドを定義します。
このメソッドのSwift構文は次のとおりです。
@IBAction func myUnwindAction(unwindSegue: UIStoryboardSegue)
このメソッドのObjective-C構文は次のとおりです。
- (IBAction)myUnwindAction:(UIStoryboardSegue*)unwindSegue
3.巻き戻しアクションを開始するView Controllerに移動します。
巻き戻しセグエを開始するボタン(または他のオブジェクト)をControlキーを押しながらクリックします。この要素は、非表示にするView Controller内にある必要があります。
View Controllerシーンの上部にあるExitオブジェクトにドラッグします。
Interface Builderで対応するアンワインドセグエを作成する前に、View Controllerの1つでアンワインドアクションメソッドを定義する必要があります。そのメソッドの存在は必須であり、アンワインドセグエの有効なターゲットがあることをInterface Builderに伝えます。
ルートView Controllerを除くスタック上のすべてのView Controllerをポップし、表示を更新します。
func popToRootViewController(animated: Bool)
ただし、特定のコントローラーに移動する場合は、以下の機能を使用します。
func popToViewController(UIViewController, animated: Bool)
指定されたView ControllerがNavigation Stackの最上位になるまでView Controllerをポップします。
あなたが探しているのは、セグエをほどくことです。
セグエの巻き戻しは、プッシュ、モーダル、ポップオーバー、およびその他のタイプのセグエを介してナビゲーションスタックを「巻き戻す」方法を提供します。巻き戻しセグエを使用して、ナビゲーション階層の1つ以上のステップを「戻る」ことができます。
ドキュメントへのリンク: https://developer.Apple.com/library/archive/technotes/tn2298/_index.html
目的を達成するには、ナビゲーションスタックを変更してから、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がモーダルの場合、上記のコードの前に最初にそれを閉じます。