Alex Smith
Alex Smith

Reputation: 385

Multiple Image Pickers in one Controller

I'm working on an onboarding flow for my app. I'm wanting to allow users to pick an avatar, display that avatar in an image view, and then select a background photo and display that in another image view. Currently, I have everything coded up, but for some reason when I present the picker controller, it defaults to controller for the avatar. I want the avatar button to only control the avatar button background image and the background button to only control the header image background image. Here's my code:

 @IBAction func getBackground(sender: AnyObject) {
    let backgroundPickerController = UIImagePickerController()
    backgroundPickerController.delegate = self
    backgroundPickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    backgroundPickerController.allowsEditing = true
    self.presentViewController(backgroundPickerController, animated: true, completion: nil)
}

@IBAction func selectAvatar(sender: AnyObject) {
    let imagePickerController = UIImagePickerController()
    imagePickerController.delegate = self
    imagePickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    imagePickerController.allowsEditing = true
    self.presentViewController(imagePickerController, animated: true, completion: nil)
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    // set image for button
    let image = info[UIImagePickerControllerOriginalImage] as? UIImage
    self.addAvatar.setImage(image, forState: .Normal)

    // Dismiss controller
    self.dismissViewControllerAnimated(false, completion: nil)
}

func backgroundPickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
  // set image for button
    let image = info[UIImagePickerControllerOriginalImage] as? UIImage
    self.headerImage.image = image
     self.dismissViewControllerAnimated(false, completion: nil)  
}

Upvotes: 1

Views: 1328

Answers (1)

R Menke
R Menke

Reputation: 8391

The delegate function imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) also returns the UIImagePickerController that finished picking an image.

So you can use an if statement to check if the picker that finished is pickerOne or pickerTwo. Then you implement different behaviour according to the result of that.

Maybe set the pickers to nil after they have finished to clean up some memory.

class multiPickerVC : UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {


    var pickerOne : UIImagePickerController?
    var pickerTwo : UIImagePickerController?


    override func viewDidLoad() {
        //
    }


    @IBAction func getBackground(sender: AnyObject) {
        pickerTwo = UIImagePickerController()
        pickerTwo!.delegate = self
        pickerTwo!.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        pickerTwo!.allowsEditing = true
        self.presentViewController(pickerTwo!, animated: true, completion: nil)
    }

    @IBAction func selectAvatar(sender: AnyObject) {
        pickerOne = UIImagePickerController()
        pickerOne!.delegate = self
        pickerOne!.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        pickerOne!.allowsEditing = true
        self.presentViewController(pickerOne!, animated: true, completion: nil)
    }


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

        if picker == pickerOne {

            // set image for button
            let image = info[UIImagePickerControllerOriginalImage] as? UIImage
            self.addAvatar.setImage(image, forState: .Normal)

        } else if picker == pickerTwo {

            // set image for button
            let image = info[UIImagePickerControllerOriginalImage] as? UIImage

            self.headerImage.image = image
        }

        self.dismissViewControllerAnimated(true, completion: nil)

    }
}

Upvotes: 4

Related Questions