画像を取得してセルに戻すUITableViewCellボタンがあります。 UIImagePickerControllerを呼び出して画像を取得すると、次のデリゲートが呼び出されません
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject], sender:AnyObject)
これは、UITableViewControllerの私のtakePhotoFunctionです。
@IBAction func takePhoto(sender: AnyObject) {
let imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
imagePickerController.allowsEditing = true
let actionSheet = UIAlertController(title: "Choose image souruce", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)
actionSheet.addAction(UIAlertAction(title: "Take Image", style: UIAlertActionStyle.Default, handler: { (alert:UIAlertAction!) -> Void in
imagePickerController.sourceType = UIImagePickerControllerSourceType.Camera
self.presentViewController(imagePickerController, animated: true, completion: nil)
}))
actionSheet.addAction(UIAlertAction(title: "Photo Library", style: UIAlertActionStyle.Default, handler: { (alert:UIAlertAction!) -> Void in
imagePickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
self.presentViewController(imagePickerController, animated: true, completion: nil)
}))
actionSheet.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil))
self.presentViewController(actionSheet, animated: true, completion: nil)}
Swiftでは、このデリゲートメソッドが呼び出されます。
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
違いは次のとおりです。
私は同じ問題を抱えていて、これらの変更を行ったときにそれはうまくいきました。
1。_UIImagePickerControllerDelegate,UINavigationControllerDelegate
_を追加することを忘れないでください
2。 viewDidLoad()
に_picker.delegate = self
_を追加します
3。デリゲートメソッドを追加
_public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
userImageView.contentMode = .scaleAspectFit
userImageView.image = chosenImage
dismiss(animated:true, completion: nil)
}
public func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {self.dismiss(animated: true, completion: nil)
}
_
それが役に立てば幸い :)
Swift 4.2の場合
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let chosenImage = info[.originalImage] as? UIImage{
//use image
}
}
Swift 4.2の場合
このメソッドは名前が変更され、以下のように呼び出す必要があります。このデリゲートメソッドが呼び出さなかったのと同じ問題がありましたが、その後、私の問題は解決しました。
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
}
Swift 4.2:
public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){
}
Swift 5を使用すると、わずかに更新されます
これは、iOS 12.2でこれをテストするために作成した単一画面の例です。
import UIKit
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
}
//MARK: Open Photos Galley Button Action method
@IBAction func openPhotosGallery(_ sender: Any) {
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
let myPickerController = UIImagePickerController()
myPickerController.delegate = self;
myPickerController.sourceType = .photoLibrary
self.present(myPickerController, animated: true, completion: nil)
}
}
//MARK: ImagePicker Controller Delegate methods
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
self.dismiss(animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let chosenImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
imageView.image = chosenImage
dismiss(animated:true, completion: nil)
}
}
Swift 4.2の場合
デリゲートメソッドがプログラムによって呼び出されなかったときにも、同様の問題が発生しました。
imagePicker.delegate = self
は、viewDidLoad()メソッドでは[〜#〜] not [〜#〜]にする必要がありますが、ギャラリーを開くメソッドである必要があります。このような:
func openGallery()
{
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary
self.present(imagePicker, animated: true, completion: nil)
}
UIImagePickerController()オブジェクトで、allowsEditingプロパティがtrueに設定されている場合、デリゲートメソッドで次のように画像を取得する必要があります。
もしallowsEditing == true
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let pickedImage = info[.editedImage] as? UIImage {
//do something with image
}
dismiss(animated: true, completion: nil)
}
もしallowsEditing == false
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let pickedImage = info[.originalImage] as? UIImage {
//do something with image
}
dismiss(animated: true, completion: nil)
}
デリゲートメソッドはfunc imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
と呼ばれるようになりました
imagePickerController.delegate
は正しく設定されているので、誤ってdidFinishPickingMediaWithInfo
コードをViewControllerクラスの外に置いたと思います
Uが宣言したデリゲートメソッドがないため、この方法を使用する必要があります。
func imagePickerController(picker: UIImagePickerController!, didFinishPickingMediaWithInfo info:[NSObject : AnyObject]) {
println("Calling")
}