0

I recently started having an issue where the popover controller will some times show up on the wrong corner. When it works correctly, the popover source is a button on the upper right corner. This is what happens most o the time. Now, when I land on this page "too quickly" from a specific route, the popover shows up on the upper left corner.

Another thing that is weird is that when loading is artificially delayed (like when I set break points for debugging) the popover shows up correctly.

Since it seemed to be a timing issue, I tried moving the navigation configuration from viewDidLoad to viewDidAppear, but this didn't work.

This function is called from viewDidLoad:

func configureNav() {

        if canAddDoc == true {
            let customButton = UIButton(type: .system)
            customButton.setImage(with: .add, tintColor: UIColor.white, imageEdgeInsets: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10))
            customButton.addTarget(self, action: #selector(showAddDocSheet), for: .touchUpInside)
            addButton = UIBarButtonItem(customView: customButton)
        }

        shareButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.action,
                                      target: self,
                                      action: #selector(shareButtonPressed))
        navigationItem.rightBarButtonItems = (addButton == nil) ? [shareButton!] : [shareButton!, addButton!]

        @objc func showAddDocSheet() {
            guard let addButton = addButton else { return }
            self.displayActionSheet(sourceButton: addButton)
        }

    }

func displayActionSheet(sourceButton: UIBarButtonItem) {

    let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)

     //Action sheet code goes here


    if let popoverController = actionSheet.popoverPresentationController {
        popoverController.barButtonItem = sourceButton
        popoverController.sourceView = sourceButton.customView
        popoverController.permittedArrowDirections = .up
    }

    self.present(actionSheet, animated: true, completion: nil)

}
paco8
  • 63
  • 6
  • What do you mean by "specific route"? You could also try to print/debug the frame of the `sourceView` in the error case to check if the `sourceButton.customView` is misaligned. – Andreas Oetjen Jun 09 '20 at 21:27

1 Answers1

0

This may sound a weird solution but something similar happened to me before and it got solved when setting the animation to false while presenting the VC ,

self.present(actionSheet, animated: false, completion: nil)