私は、AutoLayoutを使用して作成したプロトタイプセルのサブビューに追加した制約の識別子を使用しました。それが予想外にnilを見つけたので実行時に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
にすべてのセル構成コードを移動しようとしましたが、私はまったく同じ結果でした。これら2つのデリゲートメソッドのいずれかでセルのサブビューの制約にアクセスすることができるかどうかは誰にも分かりますか?最も奇妙なことは、これらのメソッドが呼び出されたときにセルのコンテンツビューの制約がロードされるが、サブビューの制約はロードされないということです。
私はCellViewクラスを使用していません。私は私のストーリーボードにセルビュー全体を作成し、タグ付きのすべてのサブビューにアクセスしています( 'cell.viewWithTag(tagNumber)')。私は通常、すべてのセルのビューを同一にしたくないので、セルのビュー内のサブビューでIBアウトレットを使用することは悪い習慣であると思います。セルの行に応じてすべてのセルのビューを設定します。 viewDidLoad()での設定に関連するセルまたはテーブルビューはありません。そのすべては、テーブルビューのデリゲートメソッドで発生します。 –
独自のCellクラスを作成する場合は、makeWithIdentiferでセルを設定してセル属性にアクセスするか、複数のセルを作成して必要な異なるタイプのセルを定義することで、テーブル(_ makeViewForRow)の行に基づいてコンテンツを変更できます次に、行に基づくサブクラスがテーブル内の別のセルを返す(_ makeViewForRow) –