数组中的UILabel未显示在ViewController

时间:2016-09-11 04:58:05

标签: ios swift

所以我试图在我的应用程序中显示一个网格/表格,为此我创建了一个UILabel数组:

var rows = 2
var columns = 2

var grid = [[UILabel]](count: rows, repeatedValue: [UILabel](count: columns, repeatedValue: UILabel()))

然后我用:

创建了每个UILabel
for i in 0 ..< grid.count
{
    for j in 0 ..< grid[0].count
    {
        grid[i][j].frame = CGRectMake(x + CGFloat(j*Int(gridSpace)), y + CGFloat(i*Int(gridSpace)), gridSpace, gridSpace)
        grid[i][j].backgroundColor = UIColor.redColor()
        grid[i][j].hidden = false

        grid[i][j].textColor = UIColor.whiteColor()
        grid[i][j].textAlignment = NSTextAlignment.Center
        grid[i][j].text = "label: [\(i)][\(j)]"

        self.view.addSubview(grid[i][j])

        print("grid[\(i)][\(j)]X = \(grid[i][j].frame.origin.x)          grid[\(i)][\(j)]Y = \(grid[i][j].frame.origin.y)")
    }
}

实际上发生的事情非常有趣。代码编译和所有内容,但只显示其中一个标签。标签的尺寸和一切都很完美,但只有其中一个出现。

显示的标签始终是网格[rows-1] [columns-1]标签。但是当我打印应该在网格数组中的其他标签的x和y坐标时,所有的坐标都正好在它们应该位于viewcontroller上的位置,只是标签不在#39; t出现。当我将for循环更改为

for i in 0 ..< grid.count-1
{
     for j in 0 ..< grid[0].count-1
     {

仍然只显示最后一个标签(网格[rows-1] [columns-1]标签),但坐标正是它们应该的位置。另一个奇怪的事情是,如果我改变了行

grid[i][j].text = "test label: [\(i)][\(j)]"

if(j != grid[0].count-1)
{
    grid[i][j].text = "test label: [\(i)][\(j)]"
}

然后显示的标签仍然具有网格[rows-1] [columns-1]的坐标,但其标签文字为grid [rows-1] [columns-2]

任何人都可以解决我的问题或解释发生了什么事吗?

1 个答案:

答案 0 :(得分:0)

这是因为您使用重复值初始化grid的方式。如果重复的值是引用类型,则数组实际上只会创建一个项目,并将所有索引指向该项目,因此在for循环中,您需要更改该帧的帧,并且只有UILabel和再次。这就是为什么你只能在屏幕上看到最后一个。

要创建要替换的数组:

var grid = [[UILabel]](count: rows, repeatedValue: [UILabel](count: columns, repeatedValue: UILabel()))

var grid = [[UILabel]]()
for row in 0..<rows {
    grid.append([UILabel]())
    for column in 0..<columns{
        grid[row].append(UILabel())
    }
}

var grid = [[UILabel]]((0..<rows).map { _ in
        [UILabel]((0..<columns).map { _ in
            UILabel()
            })
        })