John Smith Optional
John Smith Optional

Reputation: 491

nothing happens on trying to dismiss popover viewcontroller Swift

I have a viewcontroller that is presented as popover when the user clicks on an ImageView. The problem is, I added a button to dismiss it but when I tap on it nothing happens. The code I have is:

 @IBAction func onCloseTapped(_ sender: Any) {
presentedViewController?.dismiss(animated: true, completion: nil)
}

I've also tried dismiss(animated: true, completion: nil) and other methods, but still nothing.

Can anyone tell me what I am doing wrong?

Edit: Posting a screenshot: enter image description here

Edit 2: I'm presenting it from the storyboard. I've added a gesture recognizer on the image, then added segue from the storyboard that says present as popover, then anchor to the image.

Upvotes: 1

Views: 247

Answers (1)

José Neto
José Neto

Reputation: 540

it won't work because when you show as popover, the viewController doesn't have the navigationController. You have to create a delegate method and use the dismiss function on the viewController that make the call to the popover.

Here an exemple:

make the popover delegate, in the popover viewController:

protocol PopoverViewControllerDelegate: NSObjectProtocol {
    func dismiss()
}

then you create a delegate variable and call when the button is tapped:

var delegate: PopoverViewControllerDelegate?

@IBAction func onCloseTapped(_ sender: Any) {
        delegate?.dismiss()
}

Now in the viewController that call the popover you override the prepare for segue method to set the popover delegate:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "popover" {
            if let vc = segue.destination as? PopoverViewController {
                vc.delegate = self
            }
        }
    }

Now you just need to use the delegate to dismiss your popover viewController:

extension ViewController: PopoverViewControllerDelegate {
    func dismiss() {
        navigationController?.dismiss(animated: true, completion: nil)
    }
}

Don't forget to put the identifier for you segue, the identifier that we use is this = "popover"

Hope that help you.

Upvotes: 1

Related Questions