プログラムでSwiftの前のViewControllerに戻る


211

ボタンクリックでユーザーをページに送ります。このページはUITableViewControllerです。

ここで、ユーザーがセルをタップした場合、前のページに押し戻したいと思います。

私は何かについて考えましたself.performSegue("back")....が、これは悪い考えのようです。

それを行う正しい方法は何ですか?


13
self.navigationController?.popViewControllerAnimated(true)
Kalpesh

回答:


526

スウィフト3:

前のView Controllerに戻りたい場合

_ = navigationController?.popViewController(animated: true)

ルートビューコントローラーに戻りたい場合

_ = navigationController?.popToRootViewController(animated: true)

1
セルがタップされたときに、どのようにデータをpreviousControllerに送り返すことができますか?navigationController?.popViewControllerAnimated(true)を使用している場合
JDDelgado

4
@JDDelgadoこれは、ユーザーとのデータのバックを送信する方法であるstackoverflow.com/questions/12561735/...
モハマドKaakati

36
Swift 3の場合.popViewController(animated: true)
Sasho 2016年

9
警告を打ち消すには:_ = self.navigationController?.popToRootViewController(animated: true)
Andrew K

1
戻り値は無視しています。_ = そのための迅速な慣習です。
Andrew K

53

Swift 3Swift 4

if movetoroot { 
    navigationController?.popToRootViewController(animated: true)
} else {
    navigationController?.popViewController(animated: true)
}

navigationControllerは存在しない可能性があるため、オプションです。


@Vyacheslva「クロージャーでの 'seft'の暗黙的な使用、キャプチャのセマンティクスを明示的にするために 'self'を使用してください」というエラーが発生する
Sandip Subedi

@SandipSubediの使用[weak self]self?.navigationController?.
Vyacheslav

これは便利でしたが、ナビゲーションでいくつかの変数を送信したいのですが、今はできません-使用しましたが override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let vc = segue.destination as? 、これを使用すると、使用できません
Saeed Rahmatolahi

次に、navigationControllerを追加する方法は?
user25、2018

@ user25追加?どういう意味ですか?
ヴャチェスラフ

37

スウィフト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)
}

3
それは「完全に」正しくはありません。独自のナビゲーションを含むビューコントローラーを提示し、ビューコントローラーをプッシュした後、そのメソッドを使用dismiss:すると、現在のビューコントローラーだけでなく、ルートビューコントローラーも非表示になり、ここで求められたものではありません。
Ernesto Fernandez

2
この質問では、ユーザーがナビゲーションコントローラーを持っているかどうかは尋ねられませんでした。これは、ナビゲーションコントローラがない場合の最も簡単で最良の答えです。これは本当に受け入れられる答えになるはずです。
ドロイドクリス

ありがとうDroid-こんにちはernestofndz、あなたはrootVCも却下されると言うのは正しいかもしれませんが、これは私には起こりません、それはcurrentVCを却下するだけです。ストーリーボードに通常の要素を追加します。間違っている場合は私の理解を訂正してください... tableViewの場合、ユーザーが別のビューに詳細を渡す必要がある場合、これは別のケースであり、投稿した内容にリンクしておらず、100%同意しますあなたと..私が理解したことは、この場合には戻るボタンが必要であることです:)
Fullpower

多分あなたは少し紹介を追加することができます..存在するため&dismiss&navigationController?.popViewController
marlonpya

dismiss(animated: true, completion: nil)回転後は機能しません!
user924 2018

31

スウィフト4

前のViewControllerに戻る/戻るには2つの方法があります。

  1. 最初のケース:使用した場合self.navigationController?.pushViewController(yourViewController, animated: true) この場合、使用する必要がありますself.navigationController?.popViewController(animated: true)
  2. 2番目のケース:使用した場合self.present(yourViewController, animated: true, completion: nil) この場合、使用する必要がありますself.dismiss(animated: true, completion: nil)

最初のケースでは、ViewControllerをストーリーボードのnavigationControllerに埋め込んでください。


19

ie UIViewController内からを提示した場合UIViewController

// Main View Controller
self.present(otherViewController, animated: true)

dismiss関数を呼び出すだけです:

// Other View Controller
self.dismiss(animated: true)

self.dismiss(animated: true)-ローテーション後に機能しない
user924

17

Swift 5以上

ケース1:ナビゲーションコントローラーで使用する

self.navigationController?.popViewController(animated: true)

ケース2:現在のView Controllerで使用する

self.dismiss(animated: true, completion: nil)

11

Segueが「Show」または「Push」の種類の場合、UINavigationControllerのインスタンスで「popViewController(animated:Bool)」を呼び出すことができます。または、セグエが「存在」のようなものである場合、UIViewControllerのインスタンスで「dismiss(animated:Bool、completion:(()-> Void)?)」を呼び出します


7

Swift 3の場合、次のコード行を記述するだけです

_ = navigationController?.popViewController(animated: true)

2

これを試してください:前のビューではこれを使用してください:

navigationController?.popViewController(animated: true)  

ルートにポップし、このコードを使用します。

navigationController?.popToRootViewController(animated: true) 

2

最後のビューとして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つの後にビューを使用していました:)


1

ストーリーボードのviewControllerをnavigationControllerに埋め込む方法に関する質問については、次のようにします。

  1. 異なるviewControllerが配置されているストーリーボードを開きます
  2. ナビゲーションコントローラを開始するviewControllerをタップします
  3. Xcodeの上部にある「エディター」をタップします
  4. ->埋め込みをタップ
  5. ->「ナビゲーションコントローラ」をタップします

1

これは私のために動作します(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")
        }
      }
    }
}

0

こうやってやった

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)
}

0

この問題に対する別のアプローチを提案したいと思います。ナビゲーションコントローラーを使用してビューコントローラーをポップする代わりに、アンワインドセグエを使用します。このソリューションにはいくつかの、しかし非常に重要な利点があります。

  1. 起点コントローラーは、宛先について何も知らなくても、(前のコントローラーだけでなく)他の宛先コントローラーに戻ることができます。
  2. プッシュおよびポップセグエはストーリーボードで定義されるため、ビューコントローラーにナビゲーションコードはありません。

詳細については、「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)

あなたのナビゲーションが複雑になり始めたとき、私はこのアプローチが多くの利益を見つけました。

これが誰かの役に立つことを願っています。


-3

ナビゲートされたコントローラーの「viewDidDisappear」にコードを書き込むことで、ルートページにリダイレクトできます。

override func viewDidDisappear(_ animated: Bool) { self.navigationController?.popToRootViewController(animated: true) }


これにより、階層を前に移動したい場合でも、ナビゲーションコントローラーがルートにポップします。
bkSwifty 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.