Reputation: 385
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
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