2017-10-15 36 views
1

我以爲我是正確地做這個,添加addItemButton試圖激活約束之前self.view,但它拋出了這個錯誤:方案限制

「無法激活約束與錨和,因爲他們沒有共同的祖先。約束或其錨點是否引用不同視圖層次中的項目?這是非法的。「

var addItemButton: UIButton{ 
    let button = UIButton() 
    let dim: CGFloat = 64.0 

    button.frame = CGRect(x: 0, y: 0, width: dim, height: dim) 
    button.tintColor = Constants.color4 
    button.layer.cornerRadius = dim/2 
    button.layer.masksToBounds = true 

    button.translatesAutoresizingMaskIntoConstraints = false 

    return button 
} 

extension MainViewController{ 
func setupView(){ 
    view.addSubview(itemsCollectionView) 

    view.addSubview(addItemButton) 
    addItemButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
    addItemButton.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 
} 
} 

我以爲view.addSubView(addItemButton)會創建必要的層次結構。

回答

3

var addItemButton: UIButton {是一個計算變量。每次你訪問它,創建一個新的按鈕實例,因此

view.addSubview(addItemButton) 
addItemButton.centerXAnchor. ... 

addItemButton在每一行是一個新的對象。創建一個按鈕,然後嘗試將約束添加到完全不同的按鈕。

您應變量轉換成lazy之一,從一個封閉初始化:

lazy var addItemButton: UIButton = { 
    let button = UIButton() 
    let dim: CGFloat = 64.0 

    button.frame = CGRect(x: 0, y: 0, width: dim, height: dim) 
    button.tintColor = Constants.color4 
    button.layer.cornerRadius = dim/2 
    button.layer.masksToBounds = true 

    button.translatesAutoresizingMaskIntoConstraints = false 
    return button 
}() 
+0

有價值的經驗教訓,謝謝。 – Latcie