web-dev-qa-db-ja.com

SwiftでViewControllerを閉じるには?

dismissViewControllerの中でIBActionを呼び出すことで、SwiftでViewControllerを消そうとしています

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

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

random image of a segue

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

182
rshankar

あなたの画像から、Pushを使用してViewControllerを提示したように見えます

dismissViewControllerAnimatedは、モーダルを使用して表示されたViewControllerを閉じるために使用されます。

スイフト2

navigationController.popViewControllerAnimated(true)

スイフト4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)
359
Zoon Nooz

あなたの問題に対する解決策があります。モーダルを使用してビューを表示する場合は、このコードを試してView Controllerを閉じてください。

スイフト3:

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

OR

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

self.navigationController?.popViewController(animated: true)
159
satheesh

あなたがこれをするなら、私はあなたがコンソールで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")
  }    
}
17
BaSha
  1. 削除したいビューをNavigationControllerに埋め込む
  2. 識別子として "Done"を使用してBarButtonを追加します。
  3. 「完了」ボタンを選択してアシスタントエディタを起動します。
  4. このボタンのIBActionを作成します
  5. この行を角かっこに追加します。

    self.dismissViewControllerAnimated(true, completion: nil)
    
13
LAOMUSIC ARTS

つかいます:

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

の代わりに:

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

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

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

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

self.navigationController?.popViewController(animated: true)
11
Chase McElroy

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

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

あなたのViewControllerがモーダルで表示されている場合、オプションのpresentationViewControllerはnilではないでしょう、そしてコードは実行されます。

7
Peyotle

私の経験に基づいて、私は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サブクラスのView Controllerを閉じます。たとえば、キャンセルアクションの場合:

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

CancelまたはDoneから他のVC へのセグエを作成しないでください。そして、このコードをあなたのボタンに書いてください@IBAction

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

アップルから ドキュメント

表示中のView Controllerは、表示中のView Controllerを却下する責任があります。

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

モーダルを提示しているなら、あなたがすべきことは次のとおりです。

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

これは、現在のView Controllerを閉じて前のView Controllerに戻るための1つの方法です。ストーリーボードを通してのみこれを行うことができます。

  1. ストーリーボードを開く
  2. Cancelボタンを右クリックして、前のView Controllerにドラッグします。ここで、前のControllerに戻ります
  3. 今右クリックを放すと、キャンセルボタンで実行されるいくつかのアクションを見ることができます
  4. リストから "popover present"オプションを選択してください
  5. 今すぐキャンセルボタンをクリックして現在のビューを閉じることができます

これを試してください、それは私と一緒に働いています。

2番目の方法 - 使用方法 - navigationController.popViewControllerAnimated(true)

幸運..

3
Chetan Bhalara

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

2
mcfroob

Swift 4.1とXcode 9.4.1の場合

PushViewControllerを使用して新しいView Controllerを表示する場合は、これを使用してください。

self.navigationController?.popViewController(animated: false)
1
iOS

ViewControllerをモーダルで表示していて、ルートのViewControllerに戻りたい場合は、ルートのViewControllerに戻る前にこのモーダルで表示されているViewControllerを無視するように注意してください。

1
dan

Swift 3.0では

表示されているView Controllerを閉じたい場合

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

これを試して:

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

このコードは却下するボタンアクションで書かれています

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