2017-07-03 28 views
3

這是一個使用init(重複:count)創建4個子視圖的ViewController。使用init(重複:count)創建的視圖上的Swift addSubview()不起作用

在viewDidLoad中,我將它們添加爲子視圖並設置其框架。當我運行應用程序時,只會添加最後一個視圖。

class ViewController: UIViewController { 

    let subviews = [UIView].init(repeating: UIView(), count: 4) 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     for i in 0..<subviews.count { 
      self.view.addSubview(subviews[i]) 
      self.subviews[i].backgroundColor = UIColor.red 
      self.subviews[i].frame = CGRect(x: CGFloat(i) * 35, y: 30, width: 30, height: 30) 
     } 
    } 

} 

init(repeating:count) only adds last view

下面是相同的代碼只是不使用的init(重複:計數)我使用
的封閉件。這工作正常 - 所有子視圖都被添加。

class ViewController: UIViewController { 

    let subviews: [UIView] = { 
     var subviews = [UIView]() 
     for i in 0..<4 { 
      subviews.append(UIView()) 
     } 
     return subviews 
    }() 

    override func viewDidLoad() { 
     //same as above... 
    } 
} 

init closure OK

回答

3

你放UIView相同的實例您的陣列四次英寸你的viewDidLoad只是最終移動那個單一的視圖。您需要創建四個不同的UIView實例。

let subviews = (0 ..< 4).map({ _ in UIView() }) 
+0

謝謝!你發現我的錯誤。我認爲你也可以去掉地圖閉合上的外部圓括號。 – MH175

+0

你可以但我不喜歡在這種情況下。 –