I have very strange bug with default Alert
in my iOS app for iPad.
On it I have three buttons: one for camera, second for photo gallery and third is dismiss button. Alert is used to pick photos. Issue I have is sometimes, when I click on dismiss button on that alert, this type of code get's executed:
let loginVC = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginPageViewController
I'm not sure if this is exactly the code that get's executed, but it performs logout action and users get redirected to login screen.
Here's my code for Alert
func showPopover(uiView: UIView) {
let alertController = UIAlertController(title: nil, message: "Choose Photos", preferredStyle: .actionSheet)
let defaultAction = UIAlertAction(title: "Camera", style: .default, handler: { (alert: UIAlertAction!) -> Void in
self.view?.pickPhotoFromCamera()
})
let galleryAction = UIAlertAction(title: "Gallery", style: .default, handler: { (alert: UIAlertAction!) -> Void in
self.view?.pickPhotoFromLibrary()
})
let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: { (alert: UIAlertAction!) -> Void in
(self.view as? UIViewController)?.dismiss(animated: true, completion: nil)
})
alertController.addAction(defaultAction)
alertController.addAction(galleryAction)
alertController.addAction(cancelAction)
if let popoverController = alertController.popoverPresentationController {
popoverController.sourceView = uiView
popoverController.sourceRect = CGRect(x: uiView.bounds.midX, y: uiView.bounds.midY, width: 0, height: 0)
popoverController.permittedArrowDirections = []
}
(view as? UIViewController)?.tabBarController!.present(alertController, animated: true, completion: nil)
}
As you can see, my code in alert doesn't have any actions for logout, but sometimes such thing happens. Maybe someone had similar issues? What could be the reason for that?
If you need more information - let me know. Thanks in advance for your help!
First you don't need to write any code for a .cancel type action button to dismiss the presented alert view controller. Secondly, you can just use view to present the alert controller, no need to ask it's parent (tabBarController) to do it. Your code in the .cancel button dismiss the Login controller itself.
import UIKit
class LoginViewController: UIViewController {
func showPopover(uiView: UIView) {
let alertController = UIAlertController(title: nil, message: "Choose Photos", preferredStyle: .actionSheet)
let defaultAction = UIAlertAction(title: "Camera", style: .default, handler: { (alert: UIAlertAction!) -> Void in
self.pickPhotoFromCamera()
})
let galleryAction = UIAlertAction(title: "Gallery", style: .default, handler: { (alert: UIAlertAction!) -> Void in
self.pickPhotoFromLibrary()
})
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
alertController.addAction(defaultAction)
alertController.addAction(galleryAction)
alertController.addAction(cancelAction)
if let popoverController = alertController.popoverPresentationController {
popoverController.sourceView = uiView
popoverController.sourceRect = uiView.bounds
}
present(alertController, animated: true, completion: nil)
}
private func pickPhotoFromCamera() { }
private func pickPhotoFromLibrary() { }
}