How to send UIImage from didFinishPickingMediaWithInfo with Segue? - ios

So what I have:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info:[String : Any]) {
let tempImage: UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage
let imagetoTransmit: UIImage = tempImage
shootedImage = imagetoTransmit
self.performSegue(withIdentifier: "cameraSegueIdent", sender: nil)
dismiss(animated: true, completion: nil)
}
where Segue:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "cameraSegueIdent" {
let imageToTransmit: UIImage = shootedImage
let viewController = (segue.destination as! TakenPhotoPreviewViewController)
viewController.takenImage = imageToTransmit
}
}
The Image is being sent, but the Segue does not perform.Please help!
UPDATE
I went with the idea to send the image as sender, without saving in current ViewController and it worked like a charm!
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info:[String : Any]) {
let tempImage: UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage
self.dismiss(animated: true) {
self.performSegue(withIdentifier: "cameraSegueIdent", sender: tempImage)
}
}

Following might helpful.
let tempImage: UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage
let imagetoTransmit: UIImage = tempImage
shootedImage = imagetoTransmit
_ picker.dismissViewControllerAnimated(true, completion: {
self.performSegue(withIdentifier: "cameraSegueIdent", sender: nil)
})
Also, make sure that the segue identifier is correctly configured in your storyboard.

Related

Image not showing up in ImageView after using Image Picker

I am trying to write a simple app that will update the ImageView with a photo from my photos library. I can open the photos library and select a photo, but after I do that the default image in the ImageViewer does not show up. Any idea why?
import UIKit
class ViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
#IBOutlet weak var photoView: UIImageView!
#IBAction func testGesture(_ sender: UITapGestureRecognizer) {
let imagePickerController = UIImagePickerController()
imagePickerController.sourceType = .photoLibrary
imagePickerController.delegate = self
present(imagePickerController, animated: true, completion: nil)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
dismiss(animated: true, completion: nil)
}
private func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
guard let selectedImage = info[UIImagePickerController.InfoKey.originalImage.rawValue] as? UIImage else {
fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
}
photoView.image = selectedImage
dismiss(animated: true, completion: nil)
}
}
You're not using the UIImagePickerControllerDelegate's didFinishPickingMediaWithInfo method. Remove the private and modify the didFinishPickingMediaWithInfo method to the UIImagePickerControllerDelegate method syntax and you're good to go.
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
guard let selectedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else {
fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
}
photoView.image = selectedImage
print(selectedImage)
dismiss(animated: true, completion: nil)
}

Capture a still image from a video and add to a image view in separate viewcontroller Swift [duplicate]

This question already has answers here:
What does "Fatal error: Unexpectedly found nil while unwrapping an Optional value" mean?
(16 answers)
Closed 5 years ago.
I am trying to get a thumbnail from a video chosen from the image-picker and add the thumbnail into a UIImageView in a separate view-controller however, I am getting the error:
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value in the second view controller
I know what the error means I just don't understand why the thumbnail isn't being passed to the next view controller in the UIImageView
Here is my code for the first view controller.
#IBAction func upload(_ sender: Any) {
let pickerController = UIImagePickerController()
pickerController.delegate = self
pickerController.mediaTypes = ["public.movie"]
present(pickerController, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let videoUrl = info[UIImagePickerControllerMediaURL] as? URL {
self.vidurl = videoUrl
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toupload" {
let uploadvc = segue.destination as! UploadVC
uploadvc.videourl = vidurl
}
}
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage{
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toupload" {
let uploadvc = segue.destination as! UploadVC
uploadvc.previewImage.image = image
}
}
}
performSegue(withIdentifier: "toupload", sender: nil)
}
dismiss(animated: true, completion: nil)
}
here is the code for the second view-controller
#IBOutlet weak var previewImage: UIImageView!
var videourl: URL?
override func viewDidLoad() {
super.viewDidLoad()
previewImage.image = thumbnailImageForFileUrl(videourl!) Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
}
func thumbnailImageForFileUrl(_ fileUrl: URL) -> UIImage? {
let asset = AVAsset(url: fileUrl)
let imageGenerator = AVAssetImageGenerator(asset: asset)
do {
let thumbnailCGImage = try imageGenerator.copyCGImage(at: CMTimeMake(7, 1), actualTime: nil)
return UIImage(cgImage: thumbnailCGImage)
} catch let err {
print(err)
}
return nil
}
Currently you're nesting prepareForSegue function inside the callback of the picker so remove it and declare it inside the scope of the view controller so when you call performSegue the videoUrl of the class is assigned to the videUrl of the secondVC resulting in non-nil. This should be out and call performSegue
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let videoUrl = info[UIImagePickerControllerMediaURL] as? URL {
self.vidurl = videoUrl
}
else
{
}
performSegue(withIdentifier: "toupload", sender: nil)
}
///
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toupload" {
let uploadvc = segue.destination as! UploadVC
uploadvc.videourl = vidurl
}
}

Displaying selected image on screen using UIIamgePickerControllerDelegate in Swift

I am attempting to learn more about the delegate pattern. I have written an app that accesses the user's camera roll and I want to display that image on the view controller after the user selects the image. Here is what I have thus far:
import UIKit
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
#IBOutlet weak var imagePickerView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
// Delegate Methods
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
imagePickerView.image = image
}
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
self.dismiss(animated: true, completion: nil)
}
#IBAction func pickAnImage(_ sender: Any) {
let pickerController = UIImagePickerController()
present(pickerController, animated: true, completion: nil)
}
}
The camera roll appears as expected and the Cancel buttons dismiss the modal. Selecting an image also dismisses the modal, however that image is not displayed on the screen. I have confirmed that my imagePickerController is corrected referenced as an outlet. What am I missing?
You have to dismiss the controller once the image is selected, maybe the following detailed function will help you.
For Swift 4.2:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
var selectedImageFromPicker: UIImage?
if let editedImage = info[.editedImage] as? UIImage {
selectedImageFromPicker = editedImage
} else if let originalImage = info[.originalImage] as? UIImage {
selectedImageFromPicker = originalImage
}
if let selectedImage = selectedImageFromPicker {
imageView.image = selectedImage
}
dismiss(animated: true, completion: nil)
}
Before Swift 4.2:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
var selectedImageFromPicker: UIImage?
if let editedImage = info[UIImagePickerControllerEditedImage] as? UIImage {
selectedImageFromPicker = editedImage
} else if let originalImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
selectedImageFromPicker = originalImage
}
if let selectedImage = selectedImageFromPicker {
imageView.image = selectedImage
}
dismiss(animated: true, completion: nil)
}
Since I've received many points from this answer I'm adding a more concise answer (Just one line is required for setting the image to imageView).
Bonus Answer:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
imageView.image = (info[.editedImage] ?? info[.originalImage]) as? UIImage
dismiss(animated: true)
}
You need to set the view controller as the delegate of pickerController
// pickerController.delegate = self
Also check the imagePickerView outlet is connected.
Ensure you have made all inclusions in the info.plist file
Ensure you have all the delegates set
Ensure what you are using to display image (e.g if editing is set to true, then UIImagePickerControllerEditedImage else UIImagePickerControllerOriginalImage)

Swift 3 - Unable to pass image from one viewcontroller to second [duplicate]

This question already has answers here:
Passing Image to another View Controller (Swift)
(4 answers)
Closed 5 years ago.
i am trying to pass an image from 1st UIViewController to 2nd UIViewControlleler by prepareforSegue
my code :-
extension ViewController:UIImagePickerControllerDelegate,UINavigationControllerDelegate {
func handleImg() {
let picker = UIImagePickerController()
picker.delegate = self
picker.allowsEditing = true
present(picker, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
var selectedImageFromPicer : UIImage?
if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
selectedImageFromPicer = editedImage
} else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {
selectedImageFromPicer = originalImage
}
if let selectedImage = selectedImageFromPicer {
imgg.image = selectedImage
}
guard let imageUrl = info["UIImagePickerControllerImageURL"] as? URL else {
return
}
self.performSegue(withIdentifier: "selected", sender: self)
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
print("canceled picker")
dismiss(animated: true, completion: nil)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "selected" {
let vc = segue.destination as! secondVC
vc.img.image = self.imgg.image
}
}
i am getting the error on line vc.img.image = self.imgg.image
Error
fatal error: unexpectedly found nil while unwrapping an Optional value
You are getting that error because of self.imgg.image is nil. So you are only setting imgg when it is not empty like this:
if let selectedImage = selectedImageFromPicer {
imgg.image = selectedImage
}
but what if this code is never run, then it will throw an error that unexpectedly found nil.
So when you are setting it for second VC, first check if it is not null and then set it like this:
vc.img.image = self.imgg.image
Create variable in secondVC of type UIImage and from your first viewcontroller set image in that variable
You are getting this exception because views of secondVC is not yet created in memory.
So in FirstVC apply following changes
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "selected" {
let vc = segue.destination as! secondVC
vc.image = self.imgg.image
}
}
In secondVC apply following changes
Declare var image: UIImage? = nil
And in viewDidLoad() set image to imageView
override func viewDidLoad() {
super.viewDidLoad()
self.img.image = image
}

how to use multiple image picker in iOS with swift

I'm making dating app.
as you know, users need to register multiple pictures in dating app.
so i got how to use 1 image picker in one view.
but i don't know how to add multiple image picker.
i know i can only use only one
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
}
and
func imagePickerControllerDidCancel(picker: UIImagePickerController) {
picker.dismissViewControllerAnimated(false, completion:nil)
}
so i cant find solution for multiple imagepicker view.
my failed code is below.
import UIKit
class RegisterPicture : UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
#IBAction func pick1(sender: AnyObject) {
let picker1 = UIImagePickerController()
picker1.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum
picker1.allowsEditing = true
picker1.delegate = self
self.presentViewController(picker1, animated: false, completion: nil)
}
#IBAction func pick2(sender: AnyObject) {
let picker2 = UIImagePickerController()
picker2.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum
picker2.allowsEditing = true
picker2.delegate = self
self.presentViewController(picker2, animated: false, completion: nil)
}
#IBOutlet var picture1: UIImageView!
#IBOutlet var picture2: UIImageView!
func imagePickerController(picker1: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
picker1.dismissViewControllerAnimated(false, completion : nil)
self.picture1.image = info[UIImagePickerControllerOriginalImage] as? UIImage
}
func imagePickerController(picker2: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
picker2.dismissViewControllerAnimated(false, completion : nil)
self.picture2.image = info[UIImagePickerControllerOriginalImage] as? UIImage
}
func imagePickerControllerDidCancel(picker1: UIImagePickerController) {
picker1.dismissViewControllerAnimated(false, completion:nil)
}
func imagePickerControllerDidCancel(picker2: UIImagePickerController) {
picker2.dismissViewControllerAnimated(false, completion:nil)
}
}
For anyone searching for this in 2020, Apple introduced PHPickerViewController in iOS14. Here's the documentation: https://developer.apple.com/documentation/photokit/phpickerviewcontroller
And the WWDC introduction that explains its usage:
https://developer.apple.com/videos/play/wwdc2020/10652/
You can't select more than one image with UIImagePickerController. You either have to make your own custom image picker that can or use a 3rd party's like this one.
#IBAction func btnTrophy1Action(_ sender: UIButton) {
//GIVE TAG TO YOUR BUTTON
self.view.endEditing(true)
self.senderTag = sender.tag
pickerOpen(sender: sender)
}
#IBAction func btnTrophy2Action(_ sender: UIButton) {
//GIVE TAG TO YOUR BUTTON
self.view.endEditing(true)
self.senderTag = sender.tag
pickerOpen(sender: sender)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[UIImagePickerController.InfoKey.editedImage] as? UIImage {
//BASED ON THE TAG SAVE IMAGE TO PARTICULAR IMAGE PICKER
if self.senderTag == 101 {
//TROPHY 1
self.imgTrophy1.image = image
self.isTrophy1Selected = true
} else if self.senderTag == 102 {
//TROPHY 2
self.imgTrophy2.image = image
self.isTrophy2Selected = true
} else {
//TROPHY 3
self.imgTrophy3.image = image
self.isTrophy3Selected = true
}
}
picker.dismiss(animated: true, completion: nil)
}
Here is a solution I tried out to address this sort of problem
I used a single image picker then use an enum holding strings to determine which image view gets the image selected by the user.
enum selectableImage: String {
case image1
case image2
case image3
}
then on each call of the imagePickerController, I assign a variable var imageSelected = selectableImage.image1 like so.
Then finally in the imagePickerController, I used the switched structure like so:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
print("Inside imageController")
print(info)
// The info dictionary may contain multiple representations of the image. You want to use the original.
guard let imagePicked = info[.originalImage] as? UIImage else {
fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
}
// Set photoImageView to display the selected image.
switch imageSelected {
case selectableImage.image1:
image1.image = imagePicked
case selectableImage.image2:
image2.image = imagePicked
case selectableImage.image3:
image3.image = imagePicked
}
// Dismiss the picker.
dismiss(animated: true, completion: nil)
}
Hope this helps.
You can't use UIImagePickerController, but you can use a custom image picker. I think ELCImagePickerController is the best option, but here are some other libraries you could use:
Objective-C
ELCImagePickerController
WSAssetPickerController
QBImagePickerController
ZCImagePickerController
CTAssetsPickerController
AGImagePickerController
UzysAssetsPickerController
MWPhotoBrowser
TSAssetsPickerController
CustomImagePicker
InstagramPhotoPicker
GMImagePicker
DLFPhotosPicker
CombinationPickerController
AssetPicker
BSImagePicker
SNImagePicker
DoImagePickerController
grabKit
IQMediaPickerController
HySideScrollingImagePicker
MultiImageSelector
TTImagePicker
SelectImages
ImageSelectAndSave
imagepicker-multi-select
MultiSelectImagePickerController
YangMingShan(Yahoo like image selector)
DBAttachmentPickerController
BRImagePicker
GLAssetGridViewController
CreolePhotoSelection
Swift
LimPicker (Similar to WhatsApp's image picker)
RMImagePicker
DKImagePickerController
BSImagePicker
Fusuma(Instagram like image selector)
YangMingShan(Yahoo like image selector)
NohanaImagePicker
ImagePicker
OpalImagePicker
TLPhotoPicker
AssetsPickerViewController
Alerts-and-pickers/Telegram Picker

Resources