SwiftでViewControllerを閉じる方法は?


213

私は呼び出すことによって迅速にViewControllerを却下しようとdismissViewControllerしていますIBAction

  @IBAction func cancel(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
}

@IBAction func done(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
}

セグエのランダム画像

コンソール出力にprintlnメッセージが表示されましたが、ViewControllerが閉じられることはありません。何が問題でしょうか?


2
どのようにビューコントローラーを提示しましたか?
dasdom 2014

セグエを設定してマッピングを行いました-「表示」、添付のスクリーンショットを参照してください。
rshankar 14

4
モーダルを使用してみてください。プッシュを使用する場合は、ナビゲーションコントローラーのpopメソッドで閉じる必要があります。
dasdom 14

回答:


414

あなたの画像から、プッシュを使用してViewControllerを提示したようです

dismissViewControllerAnimatedモーダルを使用して提示近いViewControllersに使用されています

スウィフト2

navigationController.popViewControllerAnimated(true)

スウィフト4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)

6
「詳細を表示」セグエはどうしますか?
MoralCode、2014年

2
スウィフト2.2 !navigationController .popViewControllerAnimated(真)
swiftBoy

7
スウィフト3!navigationController .popViewController(アニメーション:真)
アレックス・トロット

174

私はあなたの問題の解決策を持っています。モーダルを使用してビューを提示する場合は、次のコードを試してビューコントローラを閉じてください。

スウィフト3:

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

または

「プッシュ」セグエを使用してビューを提示する場合

self.navigationController?.popViewController(animated: true)

1
おかげで、それでも同じ結果ですが、ViewControllerは却下されません
rshankar

4
これはOPが使用した方法とどう違うのですか?
dasdom 2014

30
私の質問に反応しないと、会話は役に立ちません。
dasdom 14

_ = self.navigationController?.popViewController(animated:true)
valexa

19

これを行うと、コンソールにprintlnメッセージが表示されない可能性があります。

@IBAction func cancel(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
   }
}

@IBAction func done(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
  }    
}

1
stackoverflow.com/questions/30840235/…。何か助けてください、私はそれでも解決策を見つけることができない長い間それで立ち往生しています
Thiha Aung

14

Swift 3.0から4.0では、これを関数に入力するのと同じくらい簡単です。

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

または、ナビゲーションコントローラを使用している場合は、「ポップ」できます。

self.navigationController?.popViewController(animated: true)

pushViewControllerを使用しているため、機能しなくなります。self.navigationController?.popViewController(animated:true)のみが機能しています。
iOS

13
  1. 閉じたいビューをNavigationControllerに埋め込む
  2. 識別子が「完了」のBarButtonを追加する
  3. [完了]ボタンを選択してアシスタントエディターを呼び出す
  4. このボタンのIBActionを作成します
  5. かっこにこの行を追加します。

    self.dismissViewControllerAnimated(true, completion: nil)

12

使用する:

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

の代わりに:

self.navigationController.dismissViewControllerAnimated(true, completion: nil)

1
追加!NavigationController
Jason G

1
@naturalc:navigationControllerがnilで!を指定した場合、アプリがクラッシュすることに注意してください
jobima

8

ナビゲーションコントローラーなしでコントローラーを提示する場合、提示されたコントローラーのメソッドから次のコードを呼び出すことができます。

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

ViewControllerがモーダルで表示される場合、オプションのpresentingViewControllerはnilではなく、コードが実行されます。


あなたは私の日を救った。
シャヌシン

6

私の経験に基づいて、UIViewControllerの拡張機能として私を閉じるメソッドを追加します。

extension UIViewController {
    func dismissMe(animated: Bool, completion: (()->())?) {
        var count = 0
        if let c = self.navigationController?.viewControllers.count {
            count = c
        }
        if count > 1 {
            self.navigationController?.popViewController(animated: animated)
            if let handler = completion {
                handler()
            }
        } else {
            dismiss(animated: animated, completion: completion)
        }
    }
}

次に、このメソッドを呼び出して、任意のUIViewControllerサブクラスのビューコントローラーを閉じます。たとえば、キャンセルアクションの場合:

class MyViewController: UIViewController {
   ...
   @IBAction func cancel(sender: AnyObject) {
     dismissMe(animated: true, completion: nil)
   }
   ...
}

6

Appleのドキュメントから:

提示するビューコントローラは、提示したビューコントローラを閉じる責任があります。

したがって、dismissメソッドをそれ自体から呼び出すことは悪い習慣です。

それをモーダルで提示している場合にすべきことは次のとおりです。

presentingViewController?.dismiss(animated: true, completion: nil)

4

CancelまたはDoneから他のVCへのセグエを作成せず、このコードをボタン@IBActionのみに記述してください

@IBAction func cancel(sender: AnyObject) {
    dismiss(animated: false, completion: nil)
}

3

これは、現在のビューコントローラーを閉じて前のビューコントローラーに戻る1つの方法です。ストーリーボードを介してのみこれを行うことができます。

  1. ストーリーボードを開く
  2. [キャンセル]ボタンを右クリックして、前のコントローラーに移動する前のビューコントローラーにドラッグします。
  3. 右クリックを放すと、キャンセルボタンで実行されるアクションが表示されます
  4. リストから「popover present」オプションを選択します
  5. キャンセルボタンをクリックして、現在のビューを閉じることができます

これを試してみてください。

第二の方法-使用- navigationController.popViewControllerAnimated(true)

幸運..


stackoverflow.com/questions/30840235/…。何か助けてください、私はそれでも解決策を見つけることができない長い間それで立ち往生しています
Thiha Aung

3
これは間違っています。代わりに、現在のビューの上に新しいビューコントローラーを表示しているビューを閉じることはないため、メモリリークが発生します。これにより、アプリがアプリストアから拒否される可能性が高くなります。
3366784

2

参考までに、間違ったView Controllerを閉じる可能性があることに注意してください。たとえば、別のモーダルの上にアラートボックスまたはモーダルが表示されている場合です。(たとえば、現在のモーダルアラートの上にTwitter投稿アラートを表示することができます)。この場合、dismissを2回呼び出すか、アンワインドセグエを使用する必要があります。


1

ViewControllerをモーダルで提示していて、ルートViewControllerに戻りたい場合は、ルートViewControllerに戻る前に、このモーダルで提示されたViewControllerを閉じるように注意してください。そうしないと、このViewControllerがメモリから削除されず、メモリリークが発生します。



1

Swift 4.1およびXcode 9.4.1の場合

pushViewControllerを使用して新しいビューコントローラを表示する場合は、これを使用します

self.navigationController?.popViewController(animated: false)

別のコピー貼り付けの答え
J. Doe

1

これを試して:

@IBAction func close() {
  dismiss(animated: true, completion: nil)
}

「dismissViewController」と呼ばれるメソッドは、単一のパラメーターのみを受け取ります。これは、前のビューにアニメーション化されたものを閉じるように見えると思いますが、これが最も簡単な解決策です。
cassiodiego

0

却下するボタンアクションで記述されたこのコード

  @IBAction func cancel(sender: AnyObject) {
   dismiss(animated: true, completion: nil)
  }

1
このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
DimaSan


0

親VCで現在のメソッドを使用している場合は、この関数を呼び出して、子VCを終了する必要があります。

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

pushメソッドを使用して子VCを呼び出す場合、子VCを閉じるにはこれを使用します

self.navigationController?.popViewController(animated: true)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.