Ios 如何将选定图像从UIImagePicker传递到UIViewController
我已经在我的应用程序中实现了一个UIImagePicker,但我正在努力将UIImage传递给UIViewController,该选择器是从下面代码中的注释启动的 下面的代码是存储在Extensions/ImageUploader.swift中的扩展名 在createActivityVC中,我有这个iAction来访问照片库并启动picker-self.imagePickerIos 如何将选定图像从UIImagePicker传递到UIViewController,ios,swift,xcode,uiimagepickercontroller,Ios,Swift,Xcode,Uiimagepickercontroller,我已经在我的应用程序中实现了一个UIImagePicker,但我正在努力将UIImage传递给UIViewController,该选择器是从下面代码中的注释启动的 下面的代码是存储在Extensions/ImageUploader.swift中的扩展名 在createActivityVC中,我有这个iAction来访问照片库并启动picker-self.imagePicker @IBAction func addPictureBtnWasPressed(_ sender: Any) {
@IBAction func addPictureBtnWasPressed(_ sender: Any) {
PHPhotoLibrary.requestAuthorization({(status:PHAuthorizationStatus) in
switch(status) {
case .notDetermined:
// Access has not been determined.
PHPhotoLibrary.requestAuthorization({ (newStatus) in
if (newStatus == PHAuthorizationStatus.authorized) {
// Access has been granted.
self.imagePicker()
}
else {
}
})
break
case .restricted:
break
case .denied:
// Access has been denied.
print("Acccess to photo denied")
break
case .authorized:
// Access has been granted.
print("Access to photo authorized")
self.imagePicker()
break
}
})
}
我想将selectedImageFromPicker传递给viewController createActivityVC。如何做到这一点?我不希望具体命名viewController,而是将其设置为动态的,以便尽可能跨多个viewController使用imagePicker。在您的表单中,是否实现了UIImageView?如果是这样的话,在你的
public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
你可以说:
myFormImageView.image = selectedImageFromPicker
然后,当您提交表单时,您可以上传表单信息+图像数据
更新:
我的方法是将UIIMagePickerController子类化
import UIKit
protocol ImagePickerDelegate {
func imagePicked(image: UIImage)
}
class myPickerViewController: UIImagePickerController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{
var imagePickerDelegate:ImagePickerDelegate!
override func viewDidLoad() {
super.viewDidLoad()
allowsEditing = true
delegate = self
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
imagePickerDelegate.imagePicked(image: selectedImage)
dismiss(animated: true, completion: nil)
}
}
class ViewController : UIViewController, ImagePickerDelegate {
func imagePicked(image: UIImage) {
imagePicked = image
}
var imagePicked:UIImage! {
didSet {
imageView.image = imagePicked
}
}
let button: UIButton = {
let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("Select an image", for: .normal)
button.backgroundColor = .red
button.addTarget(self, action: #selector(handleImagePicker), for: .touchUpInside)
return button
}()
let imageView: UIImageView = {
let iv = UIImageView()
iv.translatesAutoresizingMaskIntoConstraints = false
iv.contentMode = .scaleAspectFill
iv.layer.masksToBounds = true
iv.layer.borderWidth = 2
iv.layer.borderColor = UIColor.black.cgColor
return iv
}()
override func viewDidLoad() {
super.viewDidLoad()
title = "Get image via Delegate"
view.backgroundColor = .white
view.addSubview(button)
view.addSubview(imageView)
button.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 100).isActive = true
button.heightAnchor.constraint(equalToConstant: 30).isActive = true
button.widthAnchor.constraint(equalToConstant: 150).isActive = true
button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
imageView.topAnchor.constraint(equalTo: self.button.topAnchor, constant: 50).isActive = true
imageView.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 20).isActive = true
imageView.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: -20).isActive = true
imageView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -50).isActive = true
}
@objc func handleImagePicker() {
let myPickerVC = myPickerViewController()
myPickerVC.imagePickerDelegate = self
self.present(myPickerVC, animated: true, completion: nil )
}
}
你创建一个新项目并粘贴整个代码,我想它会像我一样工作。
希望对Swift 4.2有所帮助
使用Swift 4.2从imagePicker获取的图像更改如下代码所示
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let selectedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
imagePickerDelegate.imagePicked(image: selectedImage)
dismiss(animated: true, completion: nil)
}
出于不同的原因,我想在应用程序的多个位置使用imagePicker。因此,最好将selectedImageFromPicker传递给调用它的ViewController。有什么方法可以做到这一点吗?你能更准确一点吗?我不太清楚。如果您现在可以更新原始问题,请更新您的问题。希望这有助于使用选择器的所有视图控制器具有相同的设计?相同的设计是什么意思?它们看起来不同,代码也不同。。所以我想说它们是不同的,但它们会以同样的方式使用选择器……这段代码在哪里?如果是在VC中,则表示选取器,并且已将其正确设置为选取器代理,则只需使selectedImageFromPicker在ImagePickerControllerdFinishPickingMediaWithInfo之外可用。从表面上看,这一切都是你做的。所以,要么是一个简单的变量范围问题,要么你没有明确说明问题所在。问得好。我更新了问题以反映这一点。ViewController中调用的imagePicker函数实际上存储为一个扩展imageUploader.swift,因此不是ViewController文件的一部分啊,请阅读您对建议答案的评论。你有几个选择。在我的脑海中,根据需要将选择器实例(它只是一个特定的视图控制器)提供给任何/所有控制器。第二个选择是不用担心。。。只要在需要的地方实例化选择器。但是是的,这是糟糕的设计。第三,重构东西,使你的应用程序不需要一个以上的控制器来显示选择器-当你需要通过时,只需通过显示下一个控制器或继续向它传递图像。如果我可以让图像选择器返回selectedImageFromPicker,那么我认为应该解决这个问题。。。。这可能吗?您经常创建自己的代理吗?这听起来似乎是一个很好的候选人。您不需要命名感兴趣的视图控制器-相反,您可以让任何感兴趣的VC成为VC的代表,来演示选择器。在这一点上,采摘器VC只是简单地告诉正在进行呈现的VC一个新的图像被选中。
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let selectedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
imagePickerDelegate.imagePicked(image: selectedImage)
dismiss(animated: true, completion: nil)
}