UIImageView 上的 UITapGesture

UITapGesture on UIImageView

当 UIImageView 上没有图像时,此代码总是崩溃。

设置水龙头。

if imageView.gestureRecognizers == nil || imageView.gestureRecognizers!.count == 0 {
    let gestureRecognizer = UITapGestureRecognizer(target: self, action: "fullImage:")
    imageView.addGestureRecognizer(gestureRecognizer)
}

然后,使用照片浏览器。

func fullImage(sender: AnyObject) {
    let attachedView = sender.view!!.superview!
    let images = attachedView.subviews.map{ ([=11=] as! UIImageView).image! }
    let imageView = (sender as! UIGestureRecognizer).view! as! UIImageView
    let tag = imageView.tag

    let photos = IDMPhoto.photosWithImages(images)
    let browser = IDMPhotoBrowser(photos: photos, animatedFromView: (sender as! UIGestureRecognizer).view!)
    browser.displayToolbar = false
    browser.displayActionButton = false
    browser.displayArrowButton = false
    browser.displayCounterLabel = true
    browser.scaleImage = imageView.image
    browser.usePopAnimation = true
    browser.setInitialPageIndex(UInt(tag - 1))
    ...

有什么好的方法可以避免nil crash吗?

尝试将代码放在if let :

if let image = imageView.image {
   let gestureRecognizer = UITapGestureRecognizer(target: self, action: "fullImage:")
    imageView.addGestureRecognizer(gestureRecognizer)
}

试试这个:

let images = attachedView.subviews.map{ ([=10=] as? UIImageView).image }.filter { [=10=] != nil }

这样,如果子视图不是 UIImageView,您的代码就不会崩溃,并且您可以过滤掉返回 nil 的子视图。