所以我试图在我的应用程序中显示一个网格/表格,为此我创建了一个UILabel数组:
var rows = 2
var columns = 2
var grid = [[UILabel]](count: rows, repeatedValue: [UILabel](count: columns, repeatedValue: UILabel()))
然后我用:
创建了每个UILabelfor 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]
任何人都可以解决我的问题或解释发生了什么事吗?
答案 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()
})
})