从集合视图传递到视图控制器的简单图像数据失败

Posted

技术标签:

【中文标题】从集合视图传递到视图控制器的简单图像数据失败【英文标题】:simple image data passing from collection view to view controller fail 【发布时间】:2016-01-24 04:14:08 【问题描述】:

这真的让我发疯了,因为它真的很简单。 我有一个从手机库中获取图像的 collectionviewcell

当我点击一个单元格时,我会获取获取的集合的索引(我使用 Photo Framework),然后将所选图像(通过 PHImageManage 的 imageFromAsset)发送到新的视图控制器,将此图像分配给新的 UIimage 属性,然后尝试在我的 UIimageView 插座上显示它 失败 ! 在调试窗口中,我可以看到图像正在从 collectionviewcontroller 传递到我的 FullImageViewController,我不明白为什么我的插座上出现错误(永远返回 NIL)

这里有一些代码和一个错误捕获——首先是集合控制器

 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    let cell: PhotoCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier(identifier, forIndexPath: indexPath) as! PhotoCollectionViewCell

 //   cell.contentView.backgroundColor = UIColor.redColor()
    let asset: PHAsset = photosAsset[indexPath.item] as! PHAsset

    PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: cellSize, contentMode: .AspectFit, options: nil)  (reuslt:UIImage?, info:[NSObject : AnyObject]?) -> Void in
        if let image = reuslt 
            cell.displaythunmb(image)
        
    

    return cell



func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 

    let asset=photosAsset[indexPath.item] as! PHAsset
    let size:CGSize = CGSizeMake(200, 200)

    PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: size, contentMode: .AspectFit, options: nil)  (result:UIImage?, info:[NSObject : AnyObject]?) -> Void in
        let controller:FullImageViewController = FullImageViewController()
        if let image = result 
        controller.dislpayFullImage(image)
    
    

    performSegueWithIdentifier("gofull", sender: self)


这里是完整的ImageViewController

class FullImageViewController: UIViewController 
var image:UIImage = UIImage()

@IBOutlet weak var fullimage: UIImageView!


override func viewDidLoad() 
    super.viewDidLoad()
    navigationController?.hidesBarsOnTap = true


override func viewWillAppear(animated: Bool) 
    //dislpayFullImage()



func dislpayFullImage(fullimg:UIImage)

    if let monimage:UIImage? = fullimg 
        image=monimage!
         fullimage.image = image
    


这给了我“致命错误:在展开可选值时意外发现 nil”在“fullimage.image = image”行

我尝试过解包、强制解包等,似乎没有任何效果

在债务窗口中,当我关注我必须关注的属性时:

fullimg UIImage 0x00007ff3fb6506f0 0x00007ff3fb6506f0 自检。FullImageViewController 0x00007ff3fb6526e0 0x00007ff3fb6526e0 UIKit.UIViewController UIViewController 图片 UIImage 0x00007ff3fb6506f0 0x00007ff3fb6506f0

全图 UIImageView!无 无

monimage UIImage? 0x00007ff3fb6506f0 0x00007ff3fb6506f0

知道我在哪里搞砸了>

【问题讨论】:

使用if let monimage: UIImage? 有点违背使用if let 的目的。如果fullimg 有值,您只希望它继续,但现在即使它是nil,它仍然会继续 您的fullimage 属性似乎为零。你是如何初始化它的? 我的猜测是,您在视图加载之前将图像分配给fullimage,因此fullimage 仍然是nil 你是对的,很抱歉,虽然它也不适用于 if let monimage: UIImage 仍然崩溃 第一条评论只是告诉你你错误地使用了if let。第二条评论很可能是导致崩溃的原因;) 【参考方案1】:

您正在以编程方式创建FullImageViewController 的实例,但您在此视图控制器中使用了IBOutlet

您可能希望使用情节提要对其进行实例化,因此您必须执行以下操作:

let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let destination = storyboard.instantiateViewControllerWithIdentifier("yourIdentifier") as! FullImageViewController

不要忘记为您的FullImageViewController 设置标识符。

编辑:由于您使用的是 segue,因此您应该处理在 prepareForSegue(_:) 中传递数据:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if segue.identifier == "gofull" 
        let destination = segue.destinationViewController as! FullImageViewController
        destination.someImage = result
    

但是在视图加载之前访问fullimage仍然会导致崩溃,所以你应该尝试将值传递给viewWillAppearviewDidLoad中的fullimage

在你的FullImageViewController:

var someImage: UIImage?

override func viewWillAppear(animated: Bool) 
    super.viewWillAppear(animated)

    if let image = someImage  fullimage.image = image 

【讨论】:

求助 :) 现在 fullimage.image 属性已正确更新,不再崩溃,但屏幕上仍然没有图像。我是否也应该按照您之前的建议实例化我的视图控制器? 不,已经有该视图控制器的实例。您不想创建新实例。看不到图像是另一个问题。插座是否正确连接等?

以上是关于从集合视图传递到视图控制器的简单图像数据失败的主要内容,如果未能解决你的问题,请参考以下文章

无法将数据从集合视图传递到 Xcode 中的详细视图

当数据从一个视图控制器传递到另一个视图控制器时,我如何能够传递图像?

Swift 4:将数据从集合视图单元传递到另一个没有故事板的视图控制器

将 ImageData 从一个视图控制器传递到另一个视图控制器

将数据从一个视图控制器传递到另一个(图像)

快速将图像从一个视图控制器传递到另一个视图控制器