如何在 UIImage 数组中设置第二张或中间的图像? (斯威夫特 3)

Posted

技术标签:

【中文标题】如何在 UIImage 数组中设置第二张或中间的图像? (斯威夫特 3)【英文标题】:How to set the second or middle images in a UIImage array? (Swift 3) 【发布时间】:2017-08-14 01:18:04 【问题描述】:

我正在使用一个 imagePicker,它使我能够选择 4 个图像并创建一个选定的数组。我想用我选择的那 4 个图像设置 4 个空 UIImageView 的图像。使用图像数组:images.first,我可以将第一个空 UIImageView 设置为我选择的第一个图像。我还可以使用 images.last 设置另一个空的 UIImageView 来获取第四个选定的图像。

如何设置我选择的第二个和第三个图像的空UIImageViews的图像?

我正在使用“if let”检查数组的第一个和最后一个元素,但我不知道是否可以对第二个和第三个元素进行“if let”检查以防止我的应用程序如果我不选择四个图像,则会崩溃。

    func doneButtonDidPress(_ imagePicker: ImagePickerController, images: [UIImage]) 

       let images = imageAssets

       if let imageOne = images.first 

        profileImageViewOne.image = imageOne

       

       profileImageViewTwo.image = images[1]
       profileImageViewThree.image = images[2]

       if let imageFour = images.last 

        profileImageViewFour.image = imageFour

              


    

【问题讨论】:

一组图像是难闻的气味。图像是非常大的物体;持有它们的数组可能会因为内存不足而使您崩溃。 — 另外,您的问题非常不清楚。 我试图更清楚地说明我在问什么。我打算将每个图像存储在 Firebase 中,但如果我不选择四个图像,我的应用程序将会崩溃。我只能对数组的 .first 和 .last 元素使用“if let checks”。 你听说过count吗? 【参考方案1】:

您不需要使用 if let 语句,因为如果您使用索引从图像数组中获取图像,在这种情况下它们始终是非可选的。

为避免任何崩溃,您可以检查所选图像的数量。像这样的:

func doneButtonDidPress(_ imagePicker: ImagePickerController, images: [UIImage]) 

switch images.count 
    case 1:
    profileImageViewOne.image = images.first //you don't need to unwrap it, because imageView.image is an optional parameter
    case 2:
    profileImageViewOne.image = images.first
    profileImageViewTwo.image = images[1]
    case 3:
    profileImageViewOne.image = images.first
    profileImageViewTwo.image = images[1]
    profileImageViewThree.image = images.last
    case 4:
    //same way
    default: break
    

还有另一种填充图像视图的方法。您也可以将图像视图的引用添加到数组中(例如在 viewDidLoad() 中)。

喜欢这个

let views: [UIImageView] = [] //first we need to allocate an array
//then fill it inside viewDidLoad() or whatever
views = [profileImageViewOne, profileImageViewTwo, ...]

然后用它来设置图片:

    func doneButtonDidPress(_ imagePicker: ImagePickerController, images: [UIImage]) 

         //fill imageviews in order according to images count
         for (index, image) in images.enumerated() 
             let imageView = views[index]
             imageView.image = image
         

         //if images count = 2, that method will fill only two imageviews with same indexes as images have. But it will not clear those views, that are out of range of images array
         //so if you need to clear them if images.count < views.count, you can use this:
         //put it before setting images to views, it will clear all imageviews
         views.forEach($0.image == nil)



【讨论】:

感谢您的详尽解释,并向我展示了第二个选项。我不知道该怎么做。【参考方案2】:

像这样:

let imageViews = [
    profileImageViewOne, profileImageViewTwo, 
    profileImageViewThree, profileImageViewFour
]
for (iv,im) in zip(imageViews,images) 
    iv.image = im

这会将有多少图像(最多四个)分配给该数量的图像视图。

但是,您以一种非常愚蠢的方式进行了设置。如果您 开始 使用图像视图数组(使用 outlet 集合),我的代码的第一行将是不必要的。

【讨论】:

谢谢,我也试试 for 循环。我正在以编程方式做所有事情。你的帮助很大。我正在大量调整我的代码。

以上是关于如何在 UIImage 数组中设置第二张或中间的图像? (斯威夫特 3)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Access 2007 中设置第一个连续组合框不可见?

滑动以在新的viewcontroller中显示第二张图片

如何在远程域提供的脚本中设置第 3 方 cookie?

如何在熊猫中设置第一列和第一行作为索引?

如何在 Zend Framework 2 中设置第一个应用程序

如何在添加文本“Uhr”的String中设置第三个运算符?