1

UITextFieldsを含むプロトタイプセルを持つUITableViewControllerがあります。これらのカスタムセルを構成するために、UITableViewCellサブクラスを作成しました。textFieldをアウトレットを介してセルサブクラスに接続しました(nonatomic, weak)

このサブクラスで、UITableViewControllerがデリゲートとなるプロトコルを作成しました。これにより、これらのtextFieldで何かが変更されるたびに、TableViewControllerがそれを認識します。基本的に、NSUserDefaultsの値を保存するためにこれが必要でした

さらに、これらのtextFieldsから動的に値を取得するために、次のようなことを行うことができます。

((TextFieldCell*)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:2 inSection:0]]).textField.text

ほとんどの場合、問題なく動作します。ただし、textFieldがスクロールしたためにビューの外にある場合、textField.textから取得する値は(null)です。再びビューに入るとすぐに、すべてが通常に戻ります。

私はアウトレットを弱いものから強いものに変えようとしましたが、役に立たなかった。

クラスでいくつかのプライベートNSStringを定義し、デリゲートプロトコルが呼び出されたときにそれらに入力できると思います。重要なのは、主にセル生成コードを単純化するために、プライベート変数の必要性をできるだけ低く抑えて、コードをできるだけ一般的にしたかったということです。

ビューの外にあるときにtextFieldsの値を取得する他の方法はありますか?

前もって感謝します!

4

3 に答える 3

1

しかし、UITableViewは、表示されているrectのセルのみを保持することをご存知ですか?セルが画面を離れ、別のセルが表示領域に移動するために新しいセルが必要になると、古いセルが新しいコンテンツに再利用されます。

したがって、テーブルビューの各行に1つのセルはありません。また、テーブルに大量のデータが含まれている場合、セルよりもはるかに多くの行があります。

于 2012-04-27T19:50:37.920 に答える
0

Thyraz が言ったように、UITableView は目に見える四角形のセルのみを保持し、スクロールを可能にする適切なバッファを保持します。そのため、「再利用識別子」は非常に重要であり、どのセルをどのテーブルに使用できるかを示します (心配するテーブルが複数ある場合に重要です)。残念ながら、それだけではあなたの質問には答えません。

これらの textViews のコンテンツを格納する責任は、UITableView の肩にはありません。データ ソース デリゲート プロトコルを介してそのデータを提供するのはあなたの仕事であるため、その情報についてデータ ソースにクエリを実行する必要があります。

編集:はい、つまり、このデータを別の場所に保存する必要があります。通常は、テーブル ビューを含むビュー コントローラー クラスのプロパティの形式で保存します。この目的のために NSArray を使用することをお勧めしますが、辞書を介して、または最後の手段でそれを行うこともできます (これは理論的にはこれを行うことができますが、信じられないほど悪い考えです) 、一連のプロパティ。個人的には、NSArrays は問題に適した方法で構造化されているため、ほとんど常に NSArrays を使用しますが、理論的には他の方法で行うこともできます。(私は dict ベースの構造を 1 回だけ使用しましたが、それは、データが再帰構造内にネストされている状況でした)

于 2012-04-27T19:55:13.607 に答える
0

UITableViewController は、一度画面から離れたセルを保持しません。次のパターンを使用して、メモリ管理の最適化として以前に使用されたものを取得できますが、セルが画面に表示されるたびに (デキューされた場合でも) セルの値をリセットする必要があると想定する必要があります。値になります。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier1 = @"Cell1";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
    if( cell == nil ) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier1] autorelease];
        cell2.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        cell2.editingAccessoryType = UITableViewCellAccessoryNone;
    }   
    switch( indexPath.section ) {
        case first_Section:
            if( row == 0 ) {
                cell1.textLabel.text = @"Some Text";
                cell1.accessoryView = [self myCustomViewControl];
                cell = cell1;
            }
            ... etc
    }
}
于 2012-04-27T20:02:56.270 に答える