2016-09-11 6 views
0

だから私は、グリッド/テーブルが私のアプリに表示させるためにしようとしている、とこれを実行するために私がUILabelsの配列を作成した。その後、UILabels

var rows = 2 
var columns = 2 

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

Iそれぞれの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)") 
    } 
} 

実際にはかなり面白いです。コードはコンパイルされ、すべてが表示されますが、ラベルの1つだけが表示されます。ラベルの寸法とすべてが完璧ですが、そのうちの1つだけが表示されます。

表示されるラベルは、常にgrid [rows-1] [columns-1]ラベルです。しかし、グリッド配列にあるはずの残りのラベルのx座標とy座標を印刷すると、すべての座標がビューコントローラー上にあるはずです。ラベルが表示されないだけです。私は

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

にループに変更するとき、まだ最後のラベル(グリッド[行-1] [列1]ラベル)が現れ、まだそれらがあるべき場所を正確座標です。もう一つ奇妙なことは、私は

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

にライン

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

を変更した場合、次に現れるラベルはまだグリッドの座標[行-1] [列-1]を持っていますが、持っているということですグリッドのラベルテキスト[行-1] [列-2]

誰かが私の問題を解決したり、何が起こっているのか説明できますか?

答えて

0

これは、gridを繰り返し値で初期化したためです。繰り返し値が参照型である場合、配列は実際には1つの項目だけを作成し、その項目のすべてのインデックスをポイントします。したがって、forループでは、1つのフレームだけを変更します。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() 
      }) 
     }) 
+0

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

を説明するためのありがとう! – TheNumberDevil