Хотя ответ Джогендара хорош, я вижу одну ловушку. If-else будет расти по мере увеличения числа экземпляров представления изображения в файле контроллера представления. Это может быстро стать грязным и излишне большим. Могу ли я предложить альтернативное решение:
class ImageSelectionController: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
weak var delegate: ImageSelectionControllerDelegate?
private weak var imageView: UIImageView?
private weak var presentingViewController: UIViewController?
// MARK: - Initialization
init(withImageView imageView: UIImageView?, andPresentingViewController viewController: UIViewController?) {
self.imageView = imageView
self.presentingViewController = viewController
}
// MARK: - Public
func presentImagePickerController(withConfigurationHandler handler: ((UIImagePickerController) -> Void)? = nil) -> Void {
let picker = UIImagePickerController()
picker.allowsEditing = true
picker.sourceType = .photoLibrary
handler?(picker)
picker.delegate = self
}
// MARK: - UIImagePickerController
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let chosenImage = info[UIImagePickerControllerEditedImage] as? UIImage
self.imageView?.image = chosenImage
self.delegate?.controller(self, didFinishPickingImage: chosenImage, forImageView: self.imageView)
picker.dismiss(animated: true, completion: nil)
}
}
protocol ImageSelectionControllerDelegate: AnyObject {
func controller(_ controller: ImageSelectionController, didFinishPickingImage image: UIImage?, forImageView: UIImageView?) -> Void
}
// ---- ваш контроллер просмотра ---- //
@IBOutlet weak var logoImageView: UIImageView?
@IBOutlet weak var mainPhotoImageView: UIImageView?
override func viewDidLoad() {
super.viewDidLoad()
configureGestureRecognizer()
}
@objc func addLogoHall(_ sender: AnyObject) {
let controller = ImageSelectionController.init(withImageView: self.logoImageView, andPresentingViewController: self)
controller.delegate = self
controller.presentImagePickerController()
}
@objc func addMainPhoto(_ sender: AnyObject) {
let controller = ImageSelectionController.init(withImageView: self.logoImageView, andPresentingViewController: self)
controller.presentImagePickerController { (picker) in
picker.sourceType = .camera
}
}
// MARK: - ImageSelectionControllerDelegate
func controller(_ controller: ImageSelectionController, didFinishPickingImage image: UIImage?, forImageView: UIImageView?) {
print("image picked!")
}
Делая это таким образом, вы можете поместить весь код, связанный с UIImagePickerController
, в одно место, и вам не понадобятся какие-либо случаи if-else. Опять же, нет правильного или неправильного ответа, и кто-то может также найти какой-то другой недостаток в моем решении. Вопрос только в том, как вы хотите структурировать свой код.
Удачного кодирования!