Phil Hudson Phil Hudson - 7 months ago 26
Swift Question

After picking image from UIImagePickerController() I try to show a UIAlertViewController() but it does not appear and locks the screen

After as user picks an image from a photo album, they are prompted to enter a value into a UIAlertController. However, the controller doesn't appear and the screen becomes unclickable.

It's strange as I use the exact same code for when a user takes a photo.

The code works when the self.getVal() method is not called. It works as expected. With logging, there are no errors in the code. Basically it's like the AlertController has been created behind the current viewController view. The screen becomes totally unclickable as it's not been dismissed. (That's my two pence)

See code below:

@IBAction func addBarButtonPressed(sender: UIBarButtonItem) {

var alert = UIAlertController(title: "Camera or Existing Photo", message: "Take a photo with the camera, or use an existing photo on your device.", preferredStyle: UIAlertControllerStyle.Alert)

alert.addAction(UIAlertAction(title: "Camera", style: .Default, handler: { (action: UIAlertAction!) in
self.presentCamera()
}))

alert.addAction(UIAlertAction(title: "Photos", style: .Default, handler: { (action: UIAlertAction!) in
self.presentPhotos()
}))

presentViewController(alert, animated: true, completion: nil)

}

func presentPhotos(){
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.SavedPhotosAlbum){

let imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
imagePickerController.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum
imagePickerController.mediaTypes = [kUTTypeImage as String]
imagePickerController.allowsEditing = false

self.presentViewController(imagePickerController, animated: true, completion: nil)
}
}

func presentCamera() {

if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera){

let imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
imagePickerController.sourceType = UIImagePickerControllerSourceType.Camera
imagePickerController.mediaTypes = [kUTTypeImage as String]
imagePickerController.allowsEditing = false

self.presentViewController(imagePickerController, animated: true, completion: nil)
}
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {

self.dismissViewControllerAnimated(true, completion: nil)

if (picker.sourceType == UIImagePickerControllerSourceType.Camera || picker.sourceType == UIImagePickerControllerSourceType.SavedPhotosAlbum)
{
let myImageName = NSUUID().UUIDString
let imagePath = ImageHelperService.fileInDocumentsDirectory(myImageName)

if ImageHelperService.saveImage(image, path: imagePath) {

// TODO:
// Error: This right here, when removed it runs and dismisses and updates fine, just the alertcontroller never appears so can never be dismissed
self.getVal()

while(!self.alertViewDismissed) {
NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate(timeIntervalSinceNow: 0.1))

}

let success = DataOperationsService().SaveThingyMaBob(myImageName, value: self.alertViewValue!, bar: self.bar!)
if success {

self.tableView.reloadData()
self.doChart()

} else {
// TODO: Handle error
debugPrint("Error, save failed")
}

} else {
print("image save failed")
}
}
}

func getVal() {
self.alertViewDismissed = false

let alert = UIAlertController(title: "Enter a value", message: "val", preferredStyle: .Alert)

alert.addTextFieldWithConfigurationHandler({ (textField) -> Void in
textField.text = ""
textField.keyboardType = .DecimalPad
})

alert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { (action) -> Void in
print("Skip")
self.alertViewValue = nil
self.alertViewDismissed = true
}))

alert.addAction(UIAlertAction(title: "Submit", style: .Default , handler: { (action) -> Void in
let textField = alert.textFields![0] as UITextField
print("Text field: \(textField.text)")
self.alertViewValue = UtilitiesService.textFieldUnwrapToDouble(textField.text!)
self.alertViewDismissed = true

}))

self.presentViewController(alert, animated: true, completion: nil)
}

Answer

I resolved this by placing the call to the UIAlertController before picking the image.

This isn't an exact fix, but more of a workaround if you can be flexible as to what you show first.