Ios 从另一个ViewController中的“UIImagePickerController”更改UIImageView图像会导致“致命错误:意外发现零”崩溃
我有2个UIViewController: 名为“重新运行安装程序”的ViewController“A”使用UIImageView,名为“SelectPhotos”的ViewController“B”使用imagePickerController ViewController“A”中的UIImageView上方有一个空的透明UIButton,弹出ViewController“B”,允许用户选择从相机或照片添加图片。ViewController“A”在ViewController“B”中声明,但当我尝试从ViewController“B”更改ViewController“A”上的UIImageView时,应用程序崩溃并出现错误 致命错误:在展开可选值时意外发现nil 以下是我的代码,如有任何帮助,将不胜感激: 视图控制器“A”Ios 从另一个ViewController中的“UIImagePickerController”更改UIImageView图像会导致“致命错误:意外发现零”崩溃,ios,swift,Ios,Swift,我有2个UIViewController: 名为“重新运行安装程序”的ViewController“A”使用UIImageView,名为“SelectPhotos”的ViewController“B”使用imagePickerController ViewController“A”中的UIImageView上方有一个空的透明UIButton,弹出ViewController“B”,允许用户选择从相机或照片添加图片。ViewController“A”在ViewController“B”中声明,但当
class RERUN_SETUP: UITableViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIPopoverPresentationControllerDelegate {
//USER PICTURE
@IBOutlet weak var RERUNpictureIn: UIImageView?
//TRANSPARENT BUTTON OVER THE IMAGE VIEW
@IBAction func imageButton(sender: AnyObject) {
let popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("SelectPhotos")
popoverContent!.modalPresentationStyle = .Popover
popoverContent?.modalTransitionStyle = UIModalTransitionStyle.FlipHorizontal
var popover = popoverContent!.popoverPresentationController
if let popover = popoverContent!.popoverPresentationController {
let viewForSource = sender
popover.sourceView = self.view
popoverContent!.preferredContentSize = CGSizeMake(100,80)
popover.delegate = self
popover.permittedArrowDirections = .Any
}
self.presentViewController(popoverContent!, animated: true, completion: nil)
}
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.None
}
视图控制器“B”
import UIKit
class SelectPhotos: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var savedImage = NSUserDefaults.standardUserDefaults().objectForKey("image")
var imageToSave = UIImage()
var otherController:RERUN_SETUP = RERUN_SETUP()
@IBAction func camera(sender: UIButton) {
let pickerController = UIImagePickerController()
pickerController.delegate = self
pickerController.sourceType = UIImagePickerControllerSourceType.Camera
pickerController.allowsEditing = true
self.presentViewController(pickerController, animated: true, completion: nil)
}
@IBAction func photos(sender: AnyObject) {
let pickerController = UIImagePickerController()
pickerController.delegate = self
pickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
pickerController.allowsEditing = true
self.presentViewController(pickerController, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
self.dismissViewControllerAnimated(true, completion: nil)
self.imageToSave = image
otherController.RERUNpictureIn!.image = image
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
通常,当我遇到这个错误时,它与我有一个额外的错误有关?或在某处或者我在某处错过了一个。试着处理一下这些问题,看看它是否能修复您的错误。通常,当我遇到这个错误时,它与我有额外的错误有关?或在某处或者我在某处错过了一个。尝试处理这些问题,看看它是否修复了您的错误。在视图控制器B中的图像选择器委托方法中,将图像保存到nsuserdefault,并在视图中从nsuserdefault获取该图像。并设置图像
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
let imageData = UIImagePNGRepresentation(image)
NSUserDefaults.standardUserDefaults().setObject(imageData!, forKey: "image")
NSUserDefaults.standardUserDefaults().synchronize()
}
在视图控制器中设置图像的位置
let imageData = NSUserDefaults.standardUserDefaults().objectForKey("image") as! NSData
imgView.image = UIImage(data: imageData)
在视图控制器B中,在图像选择器委托方法中,将图像保存到nsuserdefault,并在视图控制器B中,从nsuserdefault获取该图像。并设置图像
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
let imageData = UIImagePNGRepresentation(image)
NSUserDefaults.standardUserDefaults().setObject(imageData!, forKey: "image")
NSUserDefaults.standardUserDefaults().synchronize()
}
在视图控制器中设置图像的位置
let imageData = NSUserDefaults.standardUserDefaults().objectForKey("image") as! NSData
imgView.image = UIImage(data: imageData)
在ImageView中重新取消图片的原因是,对于您在SelectPhotos控制器中声明的名为otherController的空对象,该对象尚未初始化,而且该对象也没有帮助,因为您创建的对象不属于当前与应用程序一起运行的对象 要将图像发送到上一个图像,可以使用委托/协议 首先声明一个这样的协议,并用您的重新运行设置控制器实现
protocol ImageDelegate {
func getImage(image: UIImage)
}
现在在您的内部实现它
class RERUN_SETUP: UITableViewController, ImageDelegate, UIPopoverPresentationControllerDelegate {
//Your Code
//Implement method of ImageDelegate
func getImage(image: UIImage) {
self.RERUNpictureIn.image = image
}
}
现在在SelectPhotos控制器中添加一个ImageDelegate对象
import UIKit
class SelectPhotos: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var savedImage = NSUserDefaults.standardUserDefaults().objectForKey("image")
var imageToSave = UIImage()
var delegate: ImageDelegate?
@IBAction func camera(sender: UIButton) {
let pickerController = UIImagePickerController()
pickerController.delegate = self
pickerController.sourceType = UIImagePickerControllerSourceType.Camera
pickerController.allowsEditing = true
self.presentViewController(pickerController, animated: true, completion: nil)
}
@IBAction func photos(sender: AnyObject) {
let pickerController = UIImagePickerController()
pickerController.delegate = self
pickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
pickerController.allowsEditing = true
self.presentViewController(pickerController, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
self.imageToSave = image
self.delegate.getImage(self.imageToSave)
self.dismissViewControllerAnimated(true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
注意:现在在重新运行设置控制器中,您正在创建SelectPhotos对象以显示视图,只需在显示对象之前添加一行即可
objectOfSelectPhotosThatYouHvaeCreated.delegate = self
在ImageView中重新取消图片的原因是,对于您在SelectPhotos控制器中声明的名为otherController的空对象,该对象尚未初始化,而且该对象也没有帮助,因为您创建的对象不属于当前与应用程序一起运行的对象 要将图像发送到上一个图像,可以使用委托/协议 首先声明一个这样的协议,并用您的重新运行设置控制器实现
protocol ImageDelegate {
func getImage(image: UIImage)
}
现在在您的内部实现它
class RERUN_SETUP: UITableViewController, ImageDelegate, UIPopoverPresentationControllerDelegate {
//Your Code
//Implement method of ImageDelegate
func getImage(image: UIImage) {
self.RERUNpictureIn.image = image
}
}
现在在SelectPhotos控制器中添加一个ImageDelegate对象
import UIKit
class SelectPhotos: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var savedImage = NSUserDefaults.standardUserDefaults().objectForKey("image")
var imageToSave = UIImage()
var delegate: ImageDelegate?
@IBAction func camera(sender: UIButton) {
let pickerController = UIImagePickerController()
pickerController.delegate = self
pickerController.sourceType = UIImagePickerControllerSourceType.Camera
pickerController.allowsEditing = true
self.presentViewController(pickerController, animated: true, completion: nil)
}
@IBAction func photos(sender: AnyObject) {
let pickerController = UIImagePickerController()
pickerController.delegate = self
pickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
pickerController.allowsEditing = true
self.presentViewController(pickerController, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
self.imageToSave = image
self.delegate.getImage(self.imageToSave)
self.dismissViewControllerAnimated(true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
注意:现在在重新运行设置控制器中,您正在创建SelectPhotos对象以显示视图,只需在显示对象之前添加一行即可
objectOfSelectPhotosThatYouHvaeCreated.delegate = self
很抱歉回复晚了。。。实际上现在它没有崩溃,但是imageView没有更改它的图片。SelectPhotos中的这一行给我一个错误值,类型为SelectPhotos'没有成员'getImage'self.getImageself.ImageToSave我忘记添加代理,请检查我的编辑,这类似于self.delegate.getImageself.imageToSavenow崩溃时“意外发现零…”指向self.delegate!。getImageself.imageToSave顺便说一句,我不明白这个-objectOfSelectPhotosThatYouHvaeCreated.delegate=self-我应该把哪个对象放在那里?请添加您编写的代码,以便在重新运行安装控制器中显示SelectPhotos。很抱歉,回复太晚。。。实际上现在它没有崩溃,但是imageView没有更改它的图片。SelectPhotos中的这一行给我一个错误值,类型为SelectPhotos'没有成员'getImage'self.getImageself.ImageToSave我忘记添加代理,请检查我的编辑,这类似于self.delegate.getImageself.imageToSavenow崩溃时“意外发现零…”指向self.delegate!。getImageself.imageToSave顺便说一句,我不明白-objectOfSelectPhotosThatYouHvaeCreated.delegate=self-我应该将哪个对象放在那里?请添加您编写的代码,以便在重新运行安装控制器中显示SelectPhotos。