回答:
スウィフト3:
前のView Controllerに戻りたい場合
_ = navigationController?.popViewController(animated: true)
ルートビューコントローラーに戻りたい場合
_ = navigationController?.popToRootViewController(animated: true)
.popViewController(animated: true)
_ = self.navigationController?.popToRootViewController(animated: true)
_ =
そのための迅速な慣習です。
Swift 3、Swift 4
if movetoroot {
navigationController?.popToRootViewController(animated: true)
} else {
navigationController?.popViewController(animated: true)
}
navigationControllerは存在しない可能性があるため、オプションです。
[weak self]
とself?.navigationController?.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let vc = segue.destination as?
、これを使用すると、使用できません
スウィフト3
私は答えに遅れるかもしれませんが、Swift 3の場合は次のようにそれを行うことができます:
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "< Back", style: .plain, target: self, action: #selector(backAction))
// Do any additional setup if required.
}
func backAction(){
//print("Back Button Clicked")
dismiss(animated: true, completion: nil)
}
dismiss:
すると、現在のビューコントローラーだけでなく、ルートビューコントローラーも非表示になり、ここで求められたものではありません。
dismiss(animated: true, completion: nil)
回転後は機能しません!
スウィフト4
前のViewControllerに戻る/戻るには2つの方法があります。
self.navigationController?.pushViewController(yourViewController, animated: true)
この場合、使用する必要がありますself.navigationController?.popViewController(animated: true)
self.present(yourViewController, animated: true, completion: nil)
この場合、使用する必要がありますself.dismiss(animated: true, completion: nil)
最初のケースでは、ViewControllerをストーリーボードのnavigationControllerに埋め込んでください。
ie UIViewController
内からを提示した場合UIViewController
。
// Main View Controller
self.present(otherViewController, animated: true)
dismiss
関数を呼び出すだけです:
// Other View Controller
self.dismiss(animated: true)
self.dismiss(animated: true)
-ローテーション後に機能しない
最後のビューとしてTabViewControllerを備えたSwift 4.0 Xcode 10.0
最後のViewControllerがTabViewControllerに埋め込まれている場合、以下のコードはルートに送信します...
navigationController?.popToRootViewController(animated: true)
navigationController?.popViewController(animated: true)
しかし、本当に最後のビュー(Tab1、Tab2、またはTab3ビューなど)に戻りたい場合は、以下のコードを記述する必要があります。
_ = self.navigationController?.popViewController(animated: true)
これは私にとってはうまくいきます、私は私のTabViewの1つの後にビューを使用していました:)
ストーリーボードのviewControllerをnavigationControllerに埋め込む方法に関する質問については、次のようにします。
これは私のために動作します(Swift UI)
struct DetailView: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
var body: some View {
VStack {
Text("This is the detail view")
Button(action: {
self.presentationMode.wrappedValue.dismiss()
}) {
Text("Back")
}
}
}
}
こうやってやった
func showAlert() {
let alert = UIAlertController(title: "Thanks!", message: "We'll get back to you as soon as posible.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
self.dismissView()
}))
self.present(alert, animated: true)
}
func dismissView() {
navigationController?.popViewController(animated: true)
dismiss(animated: true, completion: nil)
}
この問題に対する別のアプローチを提案したいと思います。ナビゲーションコントローラーを使用してビューコントローラーをポップする代わりに、アンワインドセグエを使用します。このソリューションにはいくつかの、しかし非常に重要な利点があります。
詳細については、「Ungue Segues Step-by-Step」を参照してください。方法は前のリンクでデータを送り返す方法を含めてよりよく説明されていますが、ここで簡単に説明します。
1)目的地(起点ではない)ビューコントローラに移動し、巻き戻しセグエを追加します。
@IBAction func unwindToContact(_ unwindSegue: UIStoryboardSegue) {
//let sourceViewController = unwindSegue.source
// Use data from the view controller which initiated the unwind segue
}
2)ビューコントローラ自体から、元のビューコントローラの終了アイコンにCTRLドラッグします。
3)先ほど作成した巻き戻し機能を選択します。
4)巻き戻しセグエを選択し、名前を付けます。
5)オリジンビューコントローラーの任意の場所に移動し、アンワインドセグエを呼び出します。
performSegue(withIdentifier: "unwindToContact", sender: self)
あなたのナビゲーションが複雑になり始めたとき、私はこのアプローチが多くの利益を見つけました。
これが誰かの役に立つことを願っています。
ナビゲートされたコントローラーの「viewDidDisappear」にコードを書き込むことで、ルートページにリダイレクトできます。
override func viewDidDisappear(_ animated: Bool) {
self.navigationController?.popToRootViewController(animated: true)
}