从集合视图传递到视图控制器的简单图像数据失败
simple image data passing from collection view to view controller fail
这真的让我发疯了,因为它真的很简单。
我有一个从 phone 库
获取图像的 collectionviewcell
当我点击一个单元格时,我得到了获取的集合的索引(我正在使用 Photo Framework),然后将所选图像(通过 PHImageManage 的 imageFromAsset)发送到一个新的视图控制器,将这个图像分配给一个新的 UIimage 属性 然后尝试在我的 UIimageView 插座上显示它
失败 !
在调试 Window 中,我可以看到图像从 collectionviewcontroller 传递到我的 FullImageViewController,但我不明白为什么我的插座上出现错误(returns NIL 永远)
这里有一些代码和错误捕获 -- 首先是 collectioncontroller
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
}
}
}
这让我 "fatal error: unexpectedly found nil while unwrapping an Optional value" 在 "fullimage.image = image" 行
我试过解包、强制解包等等,似乎没有任何效果
在债务 window 中,当我关注我必须关注的属性时:
fullimg UIImage 0x00007ff3fb6506f0 0x00007ff3fb6506f0
自我 test.FullImageViewController 0x00007ff3fb6526e0 0x00007ff3fb6526e0
UIKit.UIViewController UIViewController
图像 UIImage 0x00007ff3fb6506f0 0x00007ff3fb6506f0
全图像 UIImageView!无 None
monimage UIImage? 0x00007ff3fb6506f0 0x00007ff3fb6506f0
知道我哪里搞砸了吗>
您正在以编程方式创建 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
仍然会导致崩溃,因此您应该尝试在viewWillAppear
或viewDidLoad
中将值传递给fullimage
。
在你的FullImageViewController
中:
var someImage: UIImage?
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if let image = someImage { fullimage.image = image }
}
这真的让我发疯了,因为它真的很简单。 我有一个从 phone 库
获取图像的 collectionviewcell当我点击一个单元格时,我得到了获取的集合的索引(我正在使用 Photo Framework),然后将所选图像(通过 PHImageManage 的 imageFromAsset)发送到一个新的视图控制器,将这个图像分配给一个新的 UIimage 属性 然后尝试在我的 UIimageView 插座上显示它 失败 ! 在调试 Window 中,我可以看到图像从 collectionviewcontroller 传递到我的 FullImageViewController,但我不明白为什么我的插座上出现错误(returns NIL 永远)
这里有一些代码和错误捕获 -- 首先是 collectioncontroller
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
}
}
}
这让我 "fatal error: unexpectedly found nil while unwrapping an Optional value" 在 "fullimage.image = image" 行
我试过解包、强制解包等等,似乎没有任何效果
在债务 window 中,当我关注我必须关注的属性时:
fullimg UIImage 0x00007ff3fb6506f0 0x00007ff3fb6506f0
自我 test.FullImageViewController 0x00007ff3fb6526e0 0x00007ff3fb6526e0
UIKit.UIViewController UIViewController
图像 UIImage 0x00007ff3fb6506f0 0x00007ff3fb6506f0
全图像 UIImageView!无 None
monimage UIImage? 0x00007ff3fb6506f0 0x00007ff3fb6506f0
知道我哪里搞砸了吗>
您正在以编程方式创建 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
仍然会导致崩溃,因此您应该尝试在viewWillAppear
或viewDidLoad
中将值传递给fullimage
。
在你的FullImageViewController
中:
var someImage: UIImage?
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if let image = someImage { fullimage.image = image }
}