0

私のアプリケーションでは、ユーザーがいくつかの情報を入力できるように作成UITextFieldしています。UITableViewCellこれは私のコードです:

if (![cell.contentView viewWithTag:10])
{
    UITextField *textField=[[UITextField alloc]initWithFrame:CGRectMake(0, 0, 200, 30)];
    [textField setTag:10];
    [textField setBorderStyle:UITextBorderStyleRoundedRect];
    [textField setBackgroundColor:[UIColor redColor]];
    [cell.contentView addSubview:textField];  
}

UITextFieldtextFields が重ならないように、セルごとに1回だけ作成するようにこれを行っています...しかし、たとえばユーザーがテキストフィールドに書き込むときに問題が発生しました:

row 0 -> 0
row 1 -> 1
row 2 -> 2
row 3 -> 3
row 4 -> 4 

など、行数が 10 を超えていてスクロールを開始した場合、セルがインデックスをランダムに交換していることに気付くので、次のような結果が得られます。

row 0 -> 3
row 1 -> 1
row 2 -> 2
row 3 -> 0
row 4 -> 4

UITextField.text で、各セルの固定位置のようなものやトリックを作成する方法は?

4

2 に答える 2

0

ビューコントローラーの1つでこれを行う方法の簡略化されたサンプルを次に示します。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell
        = [tableView dequeueReusableCellWithIdentifier:AttributeCellIdentifier];
    NSString *propertyName = @"...";
    NSString *className = @"...";
    UILabel *label = (UILabel*)[cell.contentView viewWithTag:1];

    UITextField* textField = (UITextField*)[cell.contentView viewWithTag:2];

    textField.text = [self stringForAttribute:propertyName];
    label.text = propertyName;

    return cell;
}

tableView:cellForRowAtIndexPath: UITableViewDataSourceプロトコルの一部です。テーブルビューが新しいセルをスクロールして表示する必要があるときはいつでも呼び出されます。ビューからスクロールアウトしたセルを自動的にリサイクルしているため、モデルの値に基づいて、このメソッドでセルの状態をリセットする必要があります。

ストーリーボードの Interface Builder でカスタム セルを構成できることを知っておくと便利な場合もあります。コントローラーが常に適切なタイプのセルを提供できるように、適切な再利用識別子を設定してください。

于 2013-07-07T03:48:19.163 に答える
0

これは「悪い」決定のように見えるかもしれませんが、次の理由により、40 個のテキストフィールドがない限り、UITextFields で UITableView を使用しないことを強くお勧めします。

  • NSIndexPath は外出先で計算され、スクロールするとユーザーがテキストフィールドに入力したテキストがテーブル内をジャンプするため、説明した方法が遅れます。

  • テキストフィールドからテキストを取得するためのロジックを実装すると、混乱が生じます。

  • 「テーブルを上下にスクロール」アニメーションを実装して、ユーザーがテキストフィールドをナビゲートできるようにするには、大きなコードを実装する必要があります。textFieldDidBeginEditing

それでもテーブルビューを使用したい場合は、UITextFields のそれぞれにいくつかのキーを設定し、NSDictionaryこのキーをいつでも取得できる特定のテキスト値にバインドするデータソース (のような) を作成することをお勧めします。

次に、おそらく次のような醜いコードが表示されます。

- (IBAction)textFieldValueChanged:(UITextField *)sender
{
    MyTableCell *cell = (MyTableCell*)sender.superview.superview;
    [self.formDataSource setObject:cell.formTextField.text forKey:cell.contentKey];
}

次に、必要に応じて formDataSourceallValuesプロパティを列挙できます。

于 2013-07-07T02:09:51.963 に答える