我已經使用了一個約束的標識符,我使用AutoLayout創建了一個原型單元格的子視圖。我嘗試使用標識符這樣的訪問限制:在UITableView cellForRowAtIndexPath方法中訪問NSLayoutConstraint?
let myConstraint:NSLayoutConstraint = cellSubview.constraints.filter({ (constraint:NSLayoutConstraint) -> Bool in
if constraint.identifier == "myIdentifier" {
return true
}
return false
}).first!
在運行時,應用程序崩潰,因爲它意外地發現爲零。這顯然是因爲過濾的約束數組中不存在的強制展開約束。在調試控制檯中,我檢查了數組中有多少個約束:儘管我在AutoLayout的子視圖中添加了30多個約束,但它顯示約束數組包含0個約束。我認爲這是因爲在調用cellForRow atIndexPath
方法時,單元格子視圖的約束尚未加載。我也嘗試將我所有的單元配置代碼移動到willDisplayCell
,但我得到了完全相同的結果。有沒有人知道是否有可能訪問這兩個委託方法之一的單元格子視圖的約束?最奇怪的是,當調用這些方法時,單元格內容視圖的約束被加載,但子視圖約束不是。
我沒有使用CellView類。我在故事板中創建了整個單元格視圖,並且正在訪問所有帶有標籤的子視圖('cell.viewWithTag(tagNumber)')。我認爲在單元格視圖內的子視圖上使用IB出口是一種不好的做法,因爲我通常不想讓每個單元格的視圖都是相同的,我想根據單元格的行來配置每個單元格的視圖。長話短說,有沒有任何單元格或表格視圖與viewDidLoad()中的配置相關。所有這些都發生在表視圖的委託方法中。 –
如果您創建自己的Cell類,則可以通過使用makeWithIdentifer設置單元格並訪問單元格屬性來更改表(_ makeViewForRow)中基於行的內容,或者可以通過使多個單元格定義不同類型的單元格子類然後根據行返回表中的不同單元格(_ makeViewForRow) –