如何将UIImage从UIImagePickerController传递到另一个UIViewController?



几天来我一直在试图弄清楚这一点。 我已经在谷歌和堆栈中进行了大量搜索,但无法找到有效或有意义的东西。 我是 Swift 的新手,但有一些编程背景。

目前,应用程序的这一部分拍摄图片,将其显示在当前视图控制器(VCPhoto)上,移动到另一个控制器,显示动画视图控制器(VCQScan),然后移动到结果视图控制器(VCResult)。 我正在尝试将图像从VCPhoto移动到VCResult。 我找到的一个答案是这个

将图像传递给另一个视图控制器 (Swift)

在我的代码中,这将在下一个视图控制器中返回一个空值。

VCPhoto {

@IBOutlet var butTakePhoto: UIButton!
@IBOutlet var butSkip: UIButton!
@IBOutlet var scanCatB: UIButton!
@IBOutlet var previewPhoto: UIImageView!
let picker = UIImagePickerController()
override func viewDidLoad() {
super.viewDidLoad()
butTakePhoto.addTarget(self, action: #selector(VCPhoto.buttonPressed(_:)), for: .touchUpInside)
butSkip.addTarget(self, action: #selector(VCPhoto.buttonPressed(_:)), for: .touchUpInside)
scanCatB.addTarget(self, action: #selector(VCPhoto.buttonPressed(_:)), for: .touchUpInside)
picker.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
public func buttonPressed (_ sender: AnyObject?){
if sender === butTakePhoto {
if UIImagePickerController.isSourceTypeAvailable(.camera) {
picker.allowsEditing = false
picker.sourceType = UIImagePickerControllerSourceType.camera
picker.cameraCaptureMode = .photo
picker.modalPresentationStyle = .fullScreen
present(picker,animated: true,completion: nil)
}
}
if sender === scanCatB {
performSegue(withIdentifier: "sSegue", sender: UIButton.self)
}
if sender === butSkip {
performSegue(withIdentifier: "Result", sender: nil)
}
}
func imagePickerController(
_ picker:                           UIImagePickerController,
didFinishPickingMediaWithInfo info: [String : Any])
{
picker.dismiss(animated: true, completion: nil)
let image = info[UIImagePickerControllerOriginalImage] as? UIImage
previewPhoto.image = image
//butScan.isHidden=false
//butSkip.isHidden=true
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "sSegue" {
let dvc = segue.destination as? VCQScan
dvc?.newImage = previewPhoto.image
}

VCScan {

@IBOutlet var catScanImage: UIImageView!
@IBOutlet weak var browsingImage: UIImageView!
var newImage: UIImage!

override func viewDidLoad() {
super.viewDidLoad()
browsingImage.image = newImage

Timer.scheduledTimer(timeInterval: 4.0, target: self, selector: #selector(catScan), userInfo: nil, repeats: false)
catScanImage.animationImages = [
UIImage(named: "catPerc0.png")!,
UIImage(named: "catPerc1.png")!,
UIImage(named: "catPerc2.png")!,
UIImage(named: "catPerc3.png")!,
UIImage(named: "catPerc4.png")!
]
catScanImage.animationDuration = 0.4
catScanImage.startAnimating()
// Do any additional setup after loading the view, typically from a nib.
}
func catScan() {
self.performSegue(withIdentifier: "lastSegue", sender: self)
}
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "lastSegue" {
let dvc = segue.destination as! VCResult
dvc.newImage = browsingImage.image
}
}

}

上面的 segue 准备是试图将其移动到下一个 VC,但它没有走那么远,它出错了

browsingImage.image = newImage

在 VCQScan 中,即使我可以在 VCPhoto 的调试器中看到它,它似乎也没有移动图像...... 感谢您的任何帮助!!! 希望这是足够的信息,如果不让我知道! 再说一次,我是 Swift 和 Xcode 的新手,所以我有可能错过了一些非常愚蠢的东西......

调试器输出 2017-04-03 20:08:33.637110-0700 OatQuizApp[3314:1066322 [OatQuizApp.VCResult button按下:]:无法识别的选择器发送到实例0x100b1fdb0 2017-04-03 20:08:33.638569-0700 OatQuizApp[3314:1066322]* 由于未捕获的异常"NSInvalidArgumentException"而终止应用程序,原因:"-[OatQuizApp.VCResult buttonPressed:]:无法识别的选择器发送到实例0x100b1fdb0" *第一次抛出调用堆栈: (0x18ca7efd8 0x18b4e0538 0x18ca85ef4 0x18ca82f4c 0x18c97ed2c 0x192be30ec 0x192be306c 0x192bcd5e0 0x192be2950 0x192be246c 0x192bdd804 0x192bae418 0x1933a7f64 0x1933a26c0 0x1933a2aec 0x18ca2d424 0x18ca2cd94 0x18ca2a9a0 0x18c95ad94 0x18e3c4074 0x192c13130 0x1000cf900 0x18b96959c) libc++abi.dylib:以 NSException 类型的未捕获异常终止

我想出了问题。 一切都被正确编码,至少最初是这样。 我没有关注UIImageView,我在VCQScan上没有,只是添加了一个出口,这就是为什么它显示为空。 出于某种原因,我以为UIImageView只是携带图像... 我想我盯着它看得太久了。 感谢您的观看!

最新更新