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

时间:2017-09-14 14:50:37

标签: ios swift uiimageview uiimage

我为图片视图设置了占位符图片。用户可以将这些更改为其库中的照片。完成后,他们可以将这些图像上传到数据库。用户可以上传单个图像或多个图像,无论哪种方式,都可以上传为[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语句检查每个图像是否已更改。是否有更优雅的方式来实现这一目标?感谢

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

通过扩展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和flatMap”来避免使用if语句。