2017-06-25 1 views
0

私は、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つのデリゲートメソッドのいずれかでセルのサブビューの制約にアクセスすることができるかどうかは誰にも分かりますか?最も奇妙なことは、これらのメソッドが呼び出されたときにセルのコンテンツビューの制約がロードされるが、サブビューの制約はロードされないということです。

答えて

0

少なくともtable(_ makeViewForRow)までセルのサブビューにアクセスしたくないです。

このコードは、おそらくこのコードをviewDidLoad()内のCellViewクラスの内側に配置する必要があります。これにより、すべてのIBアウトレットがインスタンス化され、ロードされます。また、CellViewインスタンスに含まれるすべてのCellViewロジックを保持するのに役立ちます。

+0

私はCellViewクラスを使用していません。私は私のストーリーボードにセルビュー全体を作成し、タグ付きのすべてのサブビューにアクセスしています( 'cell.viewWithTag(tagNumber)')。私は通常、すべてのセルのビューを同一にしたくないので、セルのビュー内のサブビューでIBアウトレットを使用することは悪い習慣であると思います。セルの行に応じてすべてのセルのビューを設定します。 viewDidLoad()での設定に関連するセルまたはテーブルビューはありません。そのすべては、テーブルビューのデリゲートメソッドで発生します。 –

+1

独自のCellクラスを作成する場合は、makeWithIdentiferでセルを設定してセル属性にアクセスするか、複数のセルを作成して必要な異なるタイプのセルを定義することで、テーブル(_ makeViewForRow)の行に基づいてコンテンツを変更できます次に、行に基づくサブクラスがテーブル内の別のセルを返す(_ makeViewForRow) –

関連する問題