Ios 不同文件中的委托是否可以在视图控制器中设置变量?
背景: 我有一个视图控制器,它的根视图包含一个按钮和一个UIImage。按下按钮时,将显示UIImagePickerController。UIImagePickerController的委托是另一个名为ImagePickerDelegate的类。在ImagePikerDelegate中的一个方法中,我想使用用户刚刚拾取的图像设置imageView In view控制器 问题: 如何从ImagePickerDelegate访问ViewController中的imageView实例变量 代码:Ios 不同文件中的委托是否可以在视图控制器中设置变量?,ios,swift,delegates,Ios,Swift,Delegates,背景: 我有一个视图控制器,它的根视图包含一个按钮和一个UIImage。按下按钮时,将显示UIImagePickerController。UIImagePickerController的委托是另一个名为ImagePickerDelegate的类。在ImagePikerDelegate中的一个方法中,我想使用用户刚刚拾取的图像设置imageView In view控制器 问题: 如何从ImagePickerDelegate访问ViewController中的imageView实例变量 代码: im
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)
}
}
我最终找到了解决问题的办法。但不确定是否符合学员的最佳实践 我在ImagePickerDelegate中创建了一个实例变量,其中包含承载imageView的ViewController实例。我还为委托创建了一个初始值设定项,该初始值设定项请求承载图像的ViewController
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)
}
}
我最终找到了解决问题的办法。但不确定是否符合学员的最佳实践 我在ImagePickerDelegate中创建了一个实例变量,其中包含承载imageView的ViewController实例。我还为委托创建了一个初始值设定项,该初始值设定项请求承载图像的ViewController
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)
}
}
你能提供一些示例代码吗?你能提供一些示例代码吗?