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")
}
Printlnメッセージがコンソール出力に表示されることがありましたが、ViewControllerが却下されることはありません。問題は何でしょうか。
あなたの画像から、Pushを使用してViewControllerを提示したように見えます
dismissViewControllerAnimated
は、モーダルを使用して表示されたViewControllerを閉じるために使用されます。
スイフト2
navigationController.popViewControllerAnimated(true)
スイフト4
navigationController?.popViewController(animated: true)
dismiss(animated: true, completion: nil)
あなたの問題に対する解決策があります。モーダルを使用してビューを表示する場合は、このコードを試してView Controllerを閉じてください。
スイフト3:
self.dismiss(animated: true, completion: nil)
OR
「プッシュ」セグエを使用してビューを提示した場合
self.navigationController?.popViewController(animated: true)
あなたがこれをするなら、私はあなたがコンソールで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")
}
}
この行を角かっこに追加します。
self.dismissViewControllerAnimated(true, completion: nil)
つかいます:
self.dismiss(animated: true, completion: nil)
の代わりに:
self.navigationController.dismissViewControllerAnimated(true, completion: nil)
Swift 3.0から4.0では、これを関数に入力するのと同じくらい簡単です。
self.dismiss(animated: true, completion: nil)
ナビゲーションコントローラを使用している場合は、「ポップ」することもできます。
self.navigationController?.popViewController(animated: true)
Navigation Controllerなしでコントローラーを提示する場合は、提示されたコントローラーのメソッドから次のコードを呼び出すことができます。
self.presentingViewController?.dismiss(animated: true, completion: nil)
あなたのViewControllerがモーダルで表示されている場合、オプションのpresentationViewControllerはnilではないでしょう、そしてコードは実行されます。
私の経験に基づいて、私は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)
}
...
}
CancelまたはDoneから他のVC へのセグエを作成しないでください。そして、このコードをあなたのボタンに書いてください@IBAction
@IBAction func cancel(sender: AnyObject) {
dismiss(animated: false, completion: nil)
}
これは、現在のView Controllerを閉じて前のView Controllerに戻るための1つの方法です。ストーリーボードを通してのみこれを行うことができます。
これを試してください、それは私と一緒に働いています。
2番目の方法 - 使用方法 - navigationController.popViewControllerAnimated(true)
幸運..
参考までに、間違ったView Controllerを却下している可能性があることに注意してください。たとえば、アラートボックスまたはモーダルが別のモーダルの上に表示されているとします。 (たとえば、Twitterの投稿アラートを現在のモーダルアラートの上に表示することができます)。この場合、dismissを2回呼び出すか、または巻き戻しセグエを使用する必要があります。
Swift 4.1とXcode 9.4.1の場合
PushViewControllerを使用して新しいView Controllerを表示する場合は、これを使用してください。
self.navigationController?.popViewController(animated: false)
ViewControllerをモーダルで表示していて、ルートのViewControllerに戻りたい場合は、ルートのViewControllerに戻る前にこのモーダルで表示されているViewControllerを無視するように注意してください。
Swift 3.0では
表示されているView Controllerを閉じたい場合
self.dismiss(animated: true, completion: nil)
これを試して:
@IBAction func close() {
dismiss(animated: true, completion: nil)
}
このコードは却下するボタンアクションで書かれています
@IBAction func cancel(sender: AnyObject) {
dismiss(animated: true, completion: nil)
}