web-dev-qa-db-ja.com

ストーリーボード静的セル:dequeueReusableCellWithIdentifierはnilを返します

ストーリーボード、静的セルを使用して、cellForRowAtIndexPath:行に

UITableViewCell *cell = 
   [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

常にnilを返します。

私は以下をチェックしました:

  • セルの識別子はIB /ストーリーボードで正しく設定されており、コードで同じ識別子を使用しています。これを何度も確認しました。
  • 私は他の場所でViewControllerをインスタンス化していません(これは このstackoverflowの質問 の問題でした)。

私のビューコントローラーはUITableViewControllerのサブクラスですが、もちろん、ストーリーボードのアドホックナビゲーションコントローラーにラップされています。ビューコントローラがストーリーボードで定義されたセル識別子を知らないのは別のインスタンスである可能性があるため、これが「インスタンス化」するコードです。 prepareForSegue:では、

CustomViewController *vc = [[[segue destinationViewController] 
   viewControllers] objectAtIndex:0];

ここで行われるViewControllerの他のカスタマイズ(プロパティの設定など)は正常に機能します。

セクションと行の数が変わらず、各セルに静的テキスト(および編集する他のコントロールまたはテキストフィールド)が含まれているため、静的セルを使用しています。

これは非常に一般的なタスクのようです(ビューコントローラーのデータソースメソッドでストーリーボードから静的セルをカスタマイズします)。私は何が間違っているのですか?

21
Mundi

テーブルビューの静的コンテンツでは、データソースメソッド(tableView:cellForRowAtIndexPath:を含む)を実装しないため、セルをデキューすることはありません。静的コンテンツのデキューはありません(とにかく関与できます)。 。

特定のセルへのポインタを取得する場合:

  • cellForRowAtIndexPath:を使用してテーブルビューから取得します。

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    
  • 特定のセルへのコンセントがあり、直接カスタマイズします。

  • セルを反復処理し、reuseIdentifierプロパティをチェックして、目的のセルを取得します。

これらのことはすべて、viewWillAppearなどで実行できます。

ストーリーボードにあるコンテンツとは完全に異なるコンテンツをセルに入れたい場合は、静的セルはおそらく正しい選択ではありません。代わりに、従来のデータソースメソッドで動的プロトタイプ(ストーリーボードに複数のプロトタイプを含めることができることに注意してください)を使用する必要があります。

44
jrturton

ストーリーボードでは、静的セルは<UITableViewDataSource>プロトコルのメソッドを実装できません。

したがって、<UITableViewDelegate>に含まれているメソッドを使用できます。

0
s1ro6

Static UITableViewのdataSource/delegateメソッドを引き続き使用できます。新しいセルをcreateする必要はありません。

DataSourceメソッドを使用してセルを変更する場合は、cellForRowAtIndexPath:内:

UITableViewCell * cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];

次に、セルの変更を開始します。

0
farzadshbfn

上記の答えとは異なり、

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

動作しないでしょう。しかし、cell自体へのアウトレットを作成する前述の方法は機能しています。

UIButtonsUITextFieldsなどのビューをcellに配置し、それらのアウトレットを設定することもできます。

両方の方法を組み合わせて使用​​することもできます。例えば。をセットする cell.textLabel.text特定のセル用で、コントロールコンセントからアクセスされる別のコントロールがあります。

0
Marcus

解決策は、静的セルではなくプロトタイプセルを使用することでした。 @jrturtonが私にアイデアを最初にくれたので、私はまだチェックをしています。

私が解決したもう1つの興味深いエラー:「カスタム」タイプのプロトタイプセルで、cell.textLabelにテキストを入力しようとすると、自動的に機能しますが、他のすべてのサブビューは非常に奇妙に動作します。今はカスタムラベルを使用しているだけで、すべて正常に機能します。

乾杯、助けてくれてありがとう。

0
Mundi