上下文:
我有一个 View Controller ,其 Root View 包含一个按钮和一个 UIImage。当按下按钮时,会出现一个 UIImagePickerController。 UIImagePickerController 的委托(delegate)是另一个名为 ImagePickerDelegate 的类。在 ImagePikerDelegate 中的一种方法中,我想使用用户刚刚选择的图像在 View Controller 中设置 imageView。
问题:
如何从 ImagePickerDelegate 访问 ViewController 中的 imageView 实例变量?
代码:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var pickImageItemBarButton: UIBarButtonItem!
lazy var imagePickerDelegate: ImagePickerDelegate = ImagePickerDelegate()
override func viewDidLoad() {
super.viewDidLoad()
// enable pick image button if photo library is available
pickImageItemBarButton.isEnabled = UIImagePickerController.isSourceTypeAvailable(.photoLibrary)
}
@IBAction func pickAnImage(_ sender: UIBarButtonItem) {
let imagePicker = UIImagePickerController()
// set imagePicker properties
imagePicker.delegate = imagePickerDelegate
imagePicker.allowsEditing = false
// set the source type as photo library
imagePicker.sourceType = .photoLibrary
// check if public.image is an available mediaType
if let _ = UIImagePickerController.availableMediaTypes(for: imagePicker.sourceType)?.contains("public.image") {
// set mediaType
imagePicker.mediaTypes = ["public.image"]
// present imagePicker modally
present(imagePicker, animated: true, completion: nil)
}
}
}
class ImagePickerDelegate: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
// MARK: Delegate Functions
// cancel imagePicker
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}
// image picked
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[.originalImage] as? UIImage {
// ----This is where I need to access imageView from ViewController to set an image ----
}
// dismiss the picker modal view
picker.dismiss(animated: true, completion: nil)
}
}
最佳答案
我最终为我的问题创建了一个解决方案。不过不确定它是否符合委托(delegate)的最佳做法。
我在 ImagePickerDelegate 中创建了一个实例变量,其中包含托管 imageView 的 ViewController 实例。我还为请求托管图像的 ViewController 的委托(delegate)创建了一个初始化程序。
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var pickImageItemBarButton: UIBarButtonItem!
lazy var imagePickerDelegate: ImagePickerDelegate = ImagePickerDelegate(imageHost: self)
override func viewDidLoad() {
super.viewDidLoad()
// enable pick image button if photo library is available
pickImageItemBarButton.isEnabled = UIImagePickerController.isSourceTypeAvailable(.photoLibrary)
}
@IBAction func pickAnImage(_ sender: UIBarButtonItem) {
let imagePicker = UIImagePickerController()
// set imagePicker properties
imagePicker.delegate = imagePickerDelegate
imagePicker.allowsEditing = false
// set the source type as photo library
imagePicker.sourceType = .photoLibrary
// check if public.image is an available mediaType
if let _ = UIImagePickerController.availableMediaTypes(for: imagePicker.sourceType)?.contains("public.image") {
// set mediaType
imagePicker.mediaTypes = ["public.image"]
// present imagePicker modally
present(imagePicker, animated: true, completion: nil)
}
}
}
class ImagePickerDelegate: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
// MARK: Properties
let viewControllerHostingImage: ViewController
init(imageHost vc: ViewController) {
self.viewControllerHostingImage = vc
}
// MARK: Delegate Functions
// cancel imagePicker
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}
// image picked
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[.originalImage] as? UIImage {
// set image in hosting view controller's imageView
viewControllerHostingImage.imageView = image
}
// dismiss the picker modal view
picker.dismiss(animated: true, completion: nil)
}
}
关于ios - 有没有办法让不同文件中的委托(delegate)在 View Controller 中设置变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57648815/