从数组中动态添加 UIImageView

Dynamically adding UIImageView's from an array

我想动态地将一组 UIImageView 添加到视图中。当我遍历 for 循环时,似乎只添加了最后一个 UIImageView,而不是数组中的所有内容:

// same image to be used 
let imageName = "img.png"
let image = UIImage(named: imageName)

// array of UIImageViews
var images : [UIImageView?] = Array(count: 10, repeatedValue: UIImageView(image: image))

// iterate and add to view
for i in 0...9 {

    // setup UIImageView
    // this is how I know only the last UIImageView is added to the parent view
    // the y cordinate is about 10 points down (this is expected of i+i array size with of 10)

    images[i]?.frame = CGRect(x: 10, y: CGFloat(i+i), width: image!.size.width, height: image!.size.height)   

    // add to parent view
    parentView.addSubview(images[i]!)

}

有没有简单的解决方法?感觉好像漏了点什么。

repeatedValue: UIImageView(image: image)) 只是将对同一对象的相同引用传递到数组中。所以您有一个包含 10 个对同一图像的引用的数组。

尝试这个进行测试将表明该函数在传递正确的图像视图数组时会起作用

var images : [UIImageView] = [UIImageView(image: image), UIImageView(image: image), UIImageView(image: image), UIImageView(image: image), UIImageView(image: image)]

然后您应该将 5 个 UIImageView 添加为子视图。

在数组中使用相同的图像没有任何意义,除非它只是为了您的测试。您最好创建一组图像,这样只会有唯一的图像。然后可以使用独特的图像来创建 UIImageViews。

因为您使用的是 Array(count: 10, repeatedValue: UIImageView(image: image))repeatedValue 意味着您要添加到此数组的所有图像视图都引用了同一个对象。这样一来,你只有一个imageview,怎么可能加多少份呢。检查我的回答。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let myWidth = 40
        let myHeight = 40

        // same image to be used
        let imageName = "img.png"
        let image = UIImage(named: imageName)

        // iterate and add to view
        for i in 0...9 {
            var imageView: UIImageView = UIImageView(image: image)
            imageView.frame = CGRect(x: 10, y: myHeight * i, width: myWidth, height: myHeight)

            // add to parent view
            self.view.addSubview(imageView)

        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}