检查 UIImageView 中的图像不是占位符图像并附加到 UIImage 数组

Posted

技术标签:

【中文标题】检查 UIImageView 中的图像不是占位符图像并附加到 UIImage 数组【英文标题】:check image in UIImageView is not a placeholder image and append to UIImage array 【发布时间】:2017-09-14 14:50:36 【问题描述】:

我为我的图像视图设置了一个占位符图像。用户可以将这些更改为他们图书馆中的照片。完成此操作后,他们可以将这些图像上传到数据库。用户可以上传单个图像或多个图像,无论哪种方式,它们都作为 [UIImage] 上传。但是,我不希望上传占位符图像。

我已经设法实现了这一点,但是以一种非常不优雅的方式。我首先将 UIImageView 子类化,添加一个名为 isSet 的属性并将我所有的图像视图设置为此类:

class ItemImageViewClass: UIImageView 

//keeps track of whether the image has changed from the placeholder image.
var isSet = Bool()

然后当用户选择图像后设置图像时,isSet 属性设置为 true。

要检查图像视图中的图像是否已从占位符图像更改(即isSet == true),我使用了以下代码:

var imageArray: [UIImage]? = nil

    if imageViewOne.isSet 
    guard let mainImage = imageViewOne.image else return
        if (imageArray?.append(mainImage)) == nil 
            imageArray = [mainImage]
        
    
    if imageViewTwo.isSet 
        guard let imageTwo = imageViewTwo.image else return
        if (imageArray?.append(imageTwo)) == nil 
            imageArray = [imageTwo]
        
    

    guard imageArray != nil else 
        print("imageArray is nil")
        alertMessage("Hey!", message: "Please add some images!")
        return
    

当至少一张图片被选中时,数组将被保存到数据库中。

这似乎是一种非常混乱的方式;子类化 UIImageView 并且必须使用一系列 if 语句检查每个图像是否已更改。有没有更优雅的方法来实现这一点?谢谢

【问题讨论】:

【参考方案1】:

有一个解决方案是扩展UIImageView 以避免子类化。并且,使用 filterflatMap 绕过 if 语句。这要求您为每个UIImageView 使用对占位符图像的相同引用。

// In this example, the placeholder image is global but it doesn't have to be.
let placeHolderImage = UIImage() 

extension UIImageView 

  // Check to see if the image is the same as our placeholder 
  func isPlaceholderImage(_ placeHolderImage: UIImage = placeHolderImage) -> Bool 
    return image == placeHolderImage
  

用法:

let imageViewOne = UIImageView(image: placeHolderImage)
imageViewOne.isPlaceholderImage() // true

let imageViewTwo = UIImageView()
imageViewTwo.isPlaceholderImage() // false

let imageViewThree = UIImageView()
imageViewThree.image = UIImage(named: "my-image")
imageViewThree.isPlaceholderImage() // false

过滤和映射不是占位符或 nil 的图像:

let imageArray = [imageViewOne, imageViewTwo, imageViewThree].filter 
 !$0.isPlaceholderImage() .flatMap  $0.image 

print(imageArray) // imageViewThree.image

如果扩展不能满足您的要求,我肯定会考虑使用“filter and flatMap”来避免这种 if 语句。

【讨论】:

感谢您的回复,绝对比我的方法好。我正在努力解决最后一段代码。我知道在这个用例中.filter 将删除那些.isPlaceholderImage 的返回值为false 的图像视图,但是.flatMap $0.image 在这里做什么?我是否认为它正在访问元素的图像并将其添加到 imageArray 中?我会认为.map 会用于此目的吗? flatMap 消除了数组中的任何选项【参考方案2】:

我建议使用背景 UIImageView(占位符)和可选的前景 UIImageView(用户选择)创建一个新的 UI 组件以满足您的需求。然后只需检查可选的前景 UIImageView 是否存在,因为您可以依赖它是包含用户选择的图像的 UIImageView。

【讨论】:

以上是关于检查 UIImageView 中的图像不是占位符图像并附加到 UIImage 数组的主要内容,如果未能解决你的问题,请参考以下文章

显示 AFNetworking+UIImageView 占位符图像,但不显示 URL 图像

单个 UIImageView 显示两个单独的图像

列表视图中的Android联系人图像占位符

如何使用 IBDesignable UIImageView 在 prepareForInterfaceBuilder 中加载图像

猜猜被触摸的 UIImageView

UIImageView 中的 UIImage 位置偏移