【问题标题】:How do I populate my imageViews with different images from my imageArray instead of setting the same image for each imageView?如何使用 imageArray 中的不同图像填充 imageViews,而不是为每个 imageView 设置相同的图像?
【发布时间】:2015-12-28 18:23:44
【问题描述】:

我基本上有 2 个视图控制器:一个相机视图控制器和一个细节视图控制器。每次拍照时,我都想将它添加到我的详细视图控制器中,该控制器最多可以容纳 4 个图像视图。下面是我的详细视图控制器代码。

我的图像已添加到我的 imageArray 中,我正在尝试将它们分发到我的 4 个 imageViews,如下所示。正在改进的是来自图像数组的相同图像被设置为所有 4 个图像视图(因为每个 imageView.image == nil)。有谁知道如何改变这一点,以便每个 imageView 都由 imageArray 中的下一个图像填充?

  override func viewWillAppear(animated: Bool) {

    for img in imageArray {
        if imageArray.count < imageViewArray.count || imageArray.count == imageViewArray.count {
            for imgV in imageViewArray {
                if imgV.image == nil {
                    imgV.image = img
                }
            }
    }
    }

}
}

【问题讨论】:

    标签: ios arrays swift for-loop uiimageview


    【解决方案1】:

    所有 4 个imageViews 包含相同的image 的原因是因为在第一次迭代中,每个imageViewimage 属性为nil,并且您在imageArray 中分配了第一个image给每个imageView 一个零image

    你可以像这样使用一个 for 循环:

    for (imageView, image) in zip(imageViewArray, imageArray)
    {
        imageView.image = image
    }
    

    zip 函数会将两个数组组合成元组(imageView、image)。请注意,zip 函数将忽略第 4 个元素之后的任何图像,因为只有 4 个 imageView,反之亦然,如果图像少于 imageViews。这意味着将仅使用 imageArray 中的前四个图像,根据您问题中的代码,这似乎是您想要的。

    zip(_ :_ :)

    由两个底层序列构成的对序列,其中 第 i 个对的元素是每个底层证券的第 i 个元素 顺序。

    【讨论】:

    • 虽然 C 风格的 for 循环是 Swift 的一部分,但它越来越倾向于使用 for...in 风格。 (有人说 C 风格的 for 循环将从语言中删除。)如果您需要索引,可以迭代 enumerate() 函数:for (index, value) in imageViewArray.enumerate() { }
    • @KennethBruno:哦,酷。谢谢(你的)信息!我可能应该在答案中提到代码是从 ObjC 的角度来看的。我还没有开始学习 Swift。
    • 我在你的回答中看到了 Objective-C。该问题被标记为 Swift,因此如果可能,答案应使用 Swift 代码。有机会时试试这种语言。如果您已经了解 Objective-C,学习起来非常简单,至少在我看来,使用它看起来很棒。
    • 谢谢大家,你们不能在 Swift 中使用这种 for 循环的变体吗?出于某种原因,我仍在努力将其正确连接
    • @JamieBaker,我添加了快速版本的代码。这应该可以正常工作。
    【解决方案2】:

    这是一个使用模拟类的简化示例:

    class MockImage {
      init(_ value:Int) {
        self.value = value
      }
      var value:Int = 0
    }
    
    class MockView {
      var image:MockImage?
    }
    
    let imageArray = [MockImage(1),MockImage(3),MockImage(5)]
    var imgViewArray = [MockView?]()
    for _ in 0...3 {
      imgViewArray.append(MockView())
    }
    
    // Example code starts here
    var sequence = imageArray.generate()
    for case let imgV? in imgViewArray where imgV.image == nil {
      if let image = sequence.next() {
          imgV.image = image
      }
    }
    

    如果视图中的任何图像是nil,那么它们将被分配来自imageArray 的下一个可用图像

    【讨论】:

    • 感谢 Kenneth,此代码实际上不起作用。 imageViews 在不填充时保持空白。你认为这有什么原因吗?
    • 这显示了以您询问的方式用数据填充数组的技术,您必须更改数据值和类型以匹配您正在处理的内容。你这样做吗?
    • 我当前的 imageViewArray 在 vi​​ewdidload 中初始化并包含 4 个 imageViews。当我从我的 cameraViewController 添加图像时,我的 imageArray 被填充。在此基础上,您会说这里哪些数组需要更新?
    • 我稍微清理了代码并添加了一个模拟视图和模拟图像类,只是为了展示它应该如何工作。在你的函数中使用来自var sequence = imageArray.generate() 的代码。
    • 感谢 Kenneth,仍然无法运行。我实际上是在实现模拟类(是正确的还是应该用我的自定义值替换),然后在函数中运行示例代码。似乎不起作用 - 感觉我在这里可能很愚蠢并且错过了一些相当简单的东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多