检查 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
以避免子类化。并且,使用 filter
和 flatMap
绕过 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 图像
如何使用 IBDesignable UIImageView 在 prepareForInterfaceBuilder 中加载图像