2012-03-27 8 views
0

私は、私がかなり簡単で完全に受け入れられると思う何かをしようとしています。それ以外はそうではないようです。ビューコントローラのxibで定義されたUITextFieldをUITableViewCellsで使用できますか?

所有者がビューコントローラであるXIBを作成しました。そのXIBでは、特に複数のUITextFieldを作成し、ビューコントローラの適切なIBOutletsに配線しました。ビューコントローラは、コントローラのメインビューに含まれるUITableViewのデリゲートです。

テーブルビュー:cellForRowAtIndexPath:私は、あなたが望むように(識別子などを再利用する)UITableViewCellを作成します。次に、適切なIBOutletted UITextField(現在の行に応じて)をUITableViewCellのcontentView(最初にUITextFieldでremoveFromSuperviewを呼び出した後)に追加します。

ビューが最初に読み込まれるとき、これは正常に動作します。しかし、UITableViewにデータをリロードさせるアクションを実行すると、UITextFieldsで変なことが起こります。つまり、ほとんどはテーブルビューから消え始め、他のものは幅が劇的に縮小します。

私はやってはいけないことをしていますか?あなたが推測できるように、それらのUITextFieldをIBで設定することは、間違ったアプローチであることを除いて、非常に役に立ちます。

コードのtableViewからsnippit:cellForRowAtIndexPath:以下...

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
UITableViewCell *cell = nil; 
int row = indexPath.row; 

if (indexPath.section == kSectionReg) { 
    NSString *reuseIdent = @"RegCell"; 
    cell = [aTableView dequeueReusableCellWithIdentifier:reuseIdent]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:reuseIdent] autorelease]; 
    } 
    cell.detailTextLabel.font = [UIFont systemFontOfSize:15]; 
    cell.detailTextLabel.backgroundColor = [UIColor clearColor]; 


    if (row == [self rowIndexForRegEmail]) { 
     [regEmailText removeFromSuperview]; 
     [cell.contentView addSubview:regEmailText]; 
     cell.detailTextLabel.text = @"Email"; 
    } else if (row == [self rowIndexForRegPassword]) { 
     [regPasswordText removeFromSuperview]; 
     [cell.contentView addSubview:regPasswordText]; 
     cell.detailTextLabel.text = @"Password"; 
    ... etc... 
    } 

    return cell; 
} 
+0

'cellForRowAtIndexPath'メソッドでプログラムでテキストフィールドを作成したくない特別な理由はありますか? – sooper

+0

IBで設定するにはそれぞれのテキストフィールドが異なるように設定されていますので、コードが混乱することがあります。また、既存の実装が機能するかどうかを確認したいので、すべてをやり直す必要はありません。 –

答えて

1

を、私は100%わからないんだけど、私は、これはあなたの問題だと思う:

[regEmailText removeFromSuperview]; 
    [cell.contentView addSubview:regEmailText]; 

メモリ管理がで暗黙的ですビュー階層:ビューはサブビューを所有(保持)します。スーパービューからビューを削除すると、ビューが解放され、それ以外のものが保持されていなければ、割り当て解除されます。

セルが初めて作成されたときだけでなく、テーブルビューがセルを要求するたびにこれを実行します。removeFromSuperviewを呼び出すと、最初のパスで何か(1)によっても参照されます。それをセルに追加するために次の行にまだ周り。その後の呼び出しでは、テキストフィールドを保持するその他のものはありません。 (2)

最も簡単な修正点は、テキストフィールドに「テキスト」フィールドが表示されていないことを確認することです。あなたがARCを使用していない場合はの後にremoveFromSuperviewreleaseのあとにちょうどretainが残っています。もう1つの選択肢は、一意のテキストフィールドを持つセルごとに異なる再利用可能なセル識別子を使用することです。

もっと一般的には、Appleのtechnique for static row contentを考えてみてください。または、iOS 5を使用している場合は、ストーリーボードを使用して静的テーブルをIBで完全に実行できます。


(1)(2):ちょうど最初でそれを参照し、いくつかのフィールドのサイズが変更されますなぜ、それほど簡単で、あなたの質問には示されていないものに、部分的に依存するもの。私は今実行する必要があります - 私の答えの残りの部分はあなたの問題を解決するはずです、そして、私は後でさらに啓発のための詳細とこの答えを編集します。

+0

メモリ管理に関しては、テキストビューは実際には「保持」とマークされた@プロパティであるため、スーパービューに含まれていない場合でも、彼らはまだ積極的な保持カウントを持っている必要がありますが、それは不要なremoについての良い点ですveFromSuperviewコール。私はむしろ余分なものを取り除くでしょう。 –

1

これは完全に崩壊するでしょう。

私はこれを「静的なテーブルビュー」と見なします。つまり、同じ種類のデータを持つ同じ数のセルがそこに存在すると思います。

問題は、いずれかのセルが表示されずにスクロールされている場合です。再利用はすべて「RegCell」として識別されるためです。

脇に:を削除する必要があります。スーパービューを削除する必要があります。サブビューに追加すると元に戻すことができます。

ビュー階層を一度作成するだけです。それらは似ていますが、異なる場合は、異なる再使用識別子を使用してください。もしそれらが同じであれば、最初にビルドするだけです(if (cell == nil)の内部)

+0

それは良い点です。私はしばらくの間、各セルに独自の再利用識別子を持たせ、同じ結果が発生しました。しかし、あなたはおそらく正しいでしょう。私が解決策に到達するつもりなら、最初に、どのセルも再利用されないようにすることです。 「静的なテーブルビュー」であることも間違いありません。表面的には、すべての行が常に同時に表示されますが、キーボードが表示されているときにスクロールが発生する可能性があります。 –

関連する問題