Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从另一个ViewController中的“UIImagePickerController”更改UIImageView图像会导致“致命错误:意外发现零”崩溃_Ios_Swift - Fatal编程技术网

Ios 从另一个ViewController中的“UIImagePickerController”更改UIImageView图像会导致“致命错误:意外发现零”崩溃

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”中声明,但当

我有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”

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。