0

私は動的に生成された UITableView を持っています(そのため、静的セルではなくプロトタイプセルを使用する必要があります)。各セルには UILabel があります。さらに、各セルには少なくとも 1 つの UIControl も含まれます (現時点では、UITextfield または UISegmentedControl の可能性がありますが、将来何かを追加する場合に備えて柔軟に保ちたいと考えています)。

ユーザーは、すべてのコントロールを必要な状態に設定してから、最後に「計算」ボタンを押します。そのボタンをクリックすると、ユーザーが各コントロールで何をしたか (ユーザーが各テキスト フィールドに入力したテキスト、各コントロールで選択したセグメントなど) に関する情報を取得できる必要があります。 .

これを設定する最良の方法は何ですか?

4

3 に答える 3

1

これらの値は、テーブル自体からではなく、テーブルにデータを入力するモデル オブジェクトから取得する必要があります。データ ソースと、ユーザーがボタンをクリックしたときに必要な値を知らずに、これを行う方法を理解するのは困難です。すべての行の値が必要ですか? ラベル cellLabel を持つセルの行だけから (もしそうなら、どの cellLabel をメソッドに渡すかをどのように知ることができますか)?

どの程度クリーンアップできるかは、データの構造に大きく依存します。

于 2012-12-05T20:47:53.877 に答える
0

現在、これまでに必要な組み合わせごとに 1 つずつ、いくつかの UICell サブクラスがあります (つまり、LabelTextboxCell、LabelSegmentCell、LabelSegmentTextboxCell、LabelTextTextCell などがあります)。そのセルの情報を取得するために呼び出しを行うと、呼び出しのコードは次のようになります。

-(NSString *) getValueFor:(NSString *)cellLabel fromControl:(NSInteger *)controlCount inTable:(UITableView *)table
{
    if ([cellLabel isEqualToString:@"Label1"] || [cellLabel isEqualToString:@"Label3"])
    {
        for (LabelTextboxSegmentCell *cell in table.visibleCells)
        {
             if ([cell.label.text isEqualToString:cellLabel])
             {
                 if (controlCount == 1)
                 {
                     return cell.textfield.text;
                 }
                 else if (controlCount == 2)
                 {
                     return [cell.segment titleForSegmentAtIndex:[cell.segment selectedSegmentIndex]];
                 }
             }
             //else {continue - this is not the cell I want)
         }
    }
    else if ([cellLabel isEqualToString:@"Label2"])
    {
        //...same for loop structure and such as before except specific to LabelTextTextCell
    }
    //.... couple more else ifs and their loops
}

これはひどいです。機能しますが、面倒で、エラーが発生しやすく、将来的に追加するのが非常に難しく、ベスト プラクティスに完全に反します。しかし、それは私が今まで思いついた中で最高です。もっと良い方法があるはずです。

于 2012-12-05T17:45:11.937 に答える
0

セルは tableView で動的に行き来します。それらを使用して値を保存すると、気が狂ってしまいます。可変配列を使用してデータを保存し、セルに必要なものを提供することをお勧めします。

3つの簡単なステップで解決できます。

1、1 つの UITableCell をサブクラス化し、すべてのプロトタイプ セルに使用します。セル サブクラスで行う必要があるのは、セル内のすべての要素のすべてのプロパティを設定することです (そして、.m ファイルでそれらを合成します)。

2. IB で、すべてのセルのクラスを作成したばかりの UITableCell サブクラスとして設定します。これが重要な部分です。IB では、リンクしたい要素 (そのセル内) にセルからコントロールドラッグします。 . これは、ステップ 3 が機能するために不可欠です。

3、UITableViewControllerのcellForRowAtIndexPath:メソッドで、セルのサブクラスを使用し、必要なものにtableViewのインデックスを付けてタグ付けします(セルのメソッド呼び出しで取得します)。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellOneID = @"CellOne";
    MySubclassTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...

    cell.textFieldOne.tag = indexPath.row;
    cell.textFieldOne.delegate = self;

    cell.labelTwo.text = [myMutableArray objectForIndex:indexPath.row];
    cell.labelTwo.tag = indexPath.row;

    return cell;
}

配列内の対応するオブジェクトを変更してから呼び出すことにより、ラベル テキストを変更できます。

[self.tableView reloadData];

次に、何かが起こっていることを示すために textField が呼び出されると、そのタグをチェックして、それがどれであるかを知ることができます。(もちろん、VC で UITextField デリゲート メソッドを実装することによって)

于 2012-12-06T17:01:53.390 に答える