Ios 将图像从Swift文件(不是ViewController)传递到ViewController
我在扩展中使用cropViewController来裁剪图像。结果将出现在swift文件中(该文件不是视图控制器)。但是现在需要在另一个视图控制器中设置图像 正在使用的CropViewController: 我的视图控制器文件包含以下元素Ios 将图像从Swift文件(不是ViewController)传递到ViewController,ios,swift,Ios,Swift,我在扩展中使用cropViewController来裁剪图像。结果将出现在swift文件中(该文件不是视图控制器)。但是现在需要在另一个视图控制器中设置图像 正在使用的CropViewController: 我的视图控制器文件包含以下元素 import UIKit import XLPagerTabStrip class GetPetViewController: UIViewController, IndicatorInfoProvider { // Initialize Defau
import UIKit
import XLPagerTabStrip
class GetPetViewController: UIViewController, IndicatorInfoProvider {
// Initialize Default Value
let userDefault = UserDefaults.standard
@IBOutlet var bPetImage: UIButton!
@IBAction func bPetImage_TouchUpInside(_ sender: Any) {
// Start Action Sheet
StartImageActionSheet()
}
@IBAction func bSavePet_TouchUpInside(_ sender: Any) {
}
override func viewDidLoad() {
super.viewDidLoad()
// Set The Default Value
userDefault.set("GetPet", forKey: "senderActivity")
userDefault.synchronize()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// Tab Functionality
func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo {
return IndicatorInfo(image: UIImage(named: "ic_get_pet"), highlightedImage: UIImage(named: "ic_get_pet"), userInfo: Any?.self)
}
}
我的第二个文件(不是视图控制器)
基本上,这在swift文件中不起作用(我已经对其进行了注释),但是如果我在视图控制器本身中使用这个不带扩展名的裁剪器函数,它将起作用
bPetImage.setImage(image, for: UIControl.State.normal)
就在myImageUploadRequest(image:image)
但是获取错误:
线程1:致命错误:在隐式展开可选值时意外发现nil
因此,如果我正确获取该值,您将拥有另一个名为MyViewController
的视图控制器,其中包含按钮bPetImage
。这个按钮现在应该可以得到图像了。但您所做的是将协议设置为超类UIViewController:CropViewControllerDelegate
,该超类无权访问该按钮
在您的案例中,快速简单的解决方案可能是
(self as? MyViewController)?.bPetImage.setImage(image, for: UIControl.State.normal)
至少我希望在您的例子中,self
是MyViewController
实例。一般来说,这不是一个很好的程序。我将创建一个特定的协议,而不是一个通用的协议。我宁愿:
extension MyViewController: CropViewControllerDelegate {
在这种情况下,您可以直接调用它(您注释掉的代码)
但是,如果您真的想按您的方式使用它,让UIViewController
响应CropViewControllerDelegate
,那么我只建议您添加一个新协议。考虑这样的事情:
protocol SetCroppedImageDelegate {
func setCroppedImage(_ image: UIImage)
}
现在您键入委托而不是具体类:
public func cropViewController(_ cropViewController: CropViewController, didCropToImage image: UIImage, withRect cropRect: CGRect, angle: Int) {
(self as? SetCroppedImageDelegate)?.setCroppedImage(image)
// Call Function To Upload Image To Server
myImageUploadRequest(image: image)
cropViewController.dismiss(animated: true, completion: nil)
}
现在,您可以扩展您的MyViewController
:
extension MyViewController : SetCroppedImageDelegate {
func setCroppedImage(_ image: UIImage) {
bPetImage.setImage(image, for: UIControl.State.normal)
}
}
问题是什么?如何在viewcontroller的BPTIMAGE中设置图像在cropviewcontroller的swift文件中获取图像后(作为图像)我正在阅读您的答案并试图理解它请耐心等待我有点slow@DragonFire不用担心。花你需要的所有时间:)答案1和3中没有加载图像,答案2我正试图避免,因为我想在多个ViewController中使用此图像裁剪功能。。。但“self-as”似乎有问题,因为没有调用func setcropedimage(我尝试了打印(“函数调用”)有。@DragonFire您这边似乎还需要其他信息。视图控制器是如何连接的。那么您的委托人是谁?应该是
MyViewController
。请看我已经用这两个文件中的所有代码更新了代码
public func cropViewController(_ cropViewController: CropViewController, didCropToImage image: UIImage, withRect cropRect: CGRect, angle: Int) {
(self as? SetCroppedImageDelegate)?.setCroppedImage(image)
// Call Function To Upload Image To Server
myImageUploadRequest(image: image)
cropViewController.dismiss(animated: true, completion: nil)
}
extension MyViewController : SetCroppedImageDelegate {
func setCroppedImage(_ image: UIImage) {
bPetImage.setImage(image, for: UIControl.State.normal)
}
}