2011-02-09 7 views
2

カスタムサブビューを介してセルが作成される(各セルにラベルとテキストフィールドがあるように)UITableViewを含むViewControllerがあります。サブビューには、textFieldDidBeginEditing、textFieldDidEndEditingなどで呼び出されるTextFieldデリゲートメソッドが含まれます。UITableViewは、表示されているセルをキャッシュし、セルが表示されなくなったときに破棄します。私が持っている問題は、ユーザーがセル内のTextFieldをタップしてから、テーブルをスクロールして「編集中」のセルが表示されていない状態にしてから、新しいセルをタップして元のセルのtextFieldDidEndEditingデリゲートメソッドが表示された領域からスクロールされたときに元の/最初のTextFieldがUITableViewによって破棄されたため、「respondsToSelector:]:メッセージが割り当て解除されたインスタンスに送信されました」というエラーが発生しました。UITableView with custom cell subview - respondsToSelector:]:メッセージが割り当て解除されたインスタンスに送信されました

これまで誰もがこの問題に対処していましたが、私のtextFieldDidEndEditingメソッドを保持して、目に見えないセルを破棄せずにデータを正しく入力できるソリューションを見つけましたか?

EDIT:これはUITableViewクラスリファレンスドキュメントで見つかりました:「コンテンツの再レイアウトを避ける」カスタムのサブビューでセルを再利用する場合は、テーブルビューがセルを要求するたびにレイアウトを控えてください。 、セルが作成されるとき。

これは私の問題の根本だと思います。しかし、私はこのアドバイスに従う方法がわかりません。ヘルプ...

+0

最終的に解決策が見つかりましたか? –

+0

私のケースでは、単純にニブに指定された再利用識別子を持たないことが、セルの割り当て解除を引き起こしていたことがわかりました、ios6はこれを許していましたが、ios7はありません –

答えて

2

"UITableViewは、表示されているセルをキャッシュし、セルが見えなくなったときに破棄します。"これは、再利用識別子を指定しない場合にのみ当てはまります。あなたは、各セルは、(概念的には、少なくとも)一部のモデルオブジェクトのプロパティを提示された詳細ビューで作業している、あなたは独自の再利用識別子各セルを割り当てることができると仮定すると

。これをInterface Builderで直接設定することもできますし、プログラムでセルを作成する場合は、引数をinitWithStyle:reuseIdentifier:またはinitWithFrame:reuseIdentifierに渡すことでセルを作成できます。

再利用識別子が指定されている場合、テーブルビューはセルのライフタイム全体をキャッシュします。キャッシュからセルを取得するには

cell = [tableView dequeueReusableCellWithIdentifier:@"Some Identifier You Made Up"]; 

また、別の識別子を使用して、必要に応じて固有のセルを区別します。

固定数の一意のセルを持つ詳細ビューの代替案は、各セルへの参照をインスタンス変数に格納することです(またはコレクションのグループ全体をコレクションに格納する)。インスタンス変数を保持している限り、再利用識別子の提供を気にしなくても、セルは割り当て解除されません。これはあなたの問題になることができれば

+0

後で、私は "EDIT:ここに...いくつかのことを試した後、私はこの問題が識別子でセルを再利用することとは関係がないと考えています。それは、スクリーンから外れたときに、リリースされているセルに関連するすべてを持っています。その時点で、ユーザーが別のセル(TextFieldの別のインスタンスを使用してタップしたときに呼び出されるTextFieldデリゲートメソッド "textFieldDidEndEditing"はまだありますが... – woodmantech

+0

投稿前にあなたの編集を見たことがないので、私はあなたの元の質問に対処していました。私がより具体的にしたいのなら、あなたのコードを見る必要があります。 – jlehr

+0

私はTextFieldをリリースしました。残念ながら、このケースでは、私の会社が完全に合うようにコードを投稿する必要があります。問題を再現できる新しいテストアプリケーションを作成できるかどうか、もし可能ならば – woodmantech

0

イムは思って:

if (cell == nil) { 
    // dont do this -->cell = [[[customCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 


    NSArray *topLevelsObjects = [[NSBundle mainBundle] loadNibNamed:@"NewUserCustomCell" owner:nil options:nil]; 
    for (id currentObject in topLevelsObjects){ 
     if ([currentObject isKindOfClass:[UITableViewCell class]]){ 
      cell = (customCell *) currentObject; 
      break; 
     } 
    } 
0

あなたはまだ解決策を見つけた場合、私は知りません。しかし、私は同じ問題に直面し、私はそれを解放する前に、私のカスタムフィールドのdeallocでテキストフィールドの代理人をnilに設定することによってそれを修正しました。この方法では、デリゲートのtextFieldDidEndEditingは、割り当て解除されたセルで呼び出されません。 私は再利用識別子も使用していませんでした。

- (void)dealloc { 
    [textField_ setDelegate:nil]; 
    [textField_ release]; 
    [super dealloc]; 
} 
関連する問題