4

カスタム テーブル セルの更新については多くの質問がありますが、これは奇妙なものです。今のところ、各セルにカスタムUILabelUIImageView.

現在、セルは 2 つしかありません。最初のものは日付を表示します。テーブルが最初に読み込まれると、現在の日付が最初のセルに文字列として表示されますUILabel

最初のセルを選択すると、すべての日付の選択を処理するカスタム クラスが表示されます。日付が選択されると、このビューがポップされ、テーブル ビューに戻ります。

に、 tableviews-(void)viewDidAppearデータが再ロードされ、新しく選択された日付が表示されます。

ただし、最初のセルのラベルは更新されません。

問題を混乱させるのは、複数のセルがすべて同じデータを表示している場合、これらはすべて更新され、期待どおりに新しい日付が表示されることです。index: 0 のセル行が更新されないようです。

問題をさらに混乱させるのはUILabel、セルの文字列値を照会すると、正しい日付が返されることです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        // 
        // clears the grouped style border from each table cell
        //

        UIView *clearBgView = [[UIView alloc]initWithFrame:CGRectZero];
        [cell setBackgroundView:clearBgView];

        // label
        UILabel *dl = [[UILabel alloc]initWithFrame:CGRectMake(70.0f, 10.0f, screenWidth-100, 50)];
        [self setDetailsLabel:dl];
        dl = nil;

        [[self detailsLabel] setBackgroundColor:[UIColor colorWithRed:.1 green:.1 blue:.1 alpha:.1  ]];
        [[self detailsLabel] setTextColor:[UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:.3f]];

        //icon for each cell
        UIImageView *ci = [[UIImageView alloc]initWithFrame:CGRectMake(10.0f, 10.0f, 50.0f, 50.0f)];
        [ci setBackgroundColor:[UIColor colorWithRed:.2 green:.2 blue:.2 alpha:.2]];
        [self setCellIcon:ci];
        ci = nil;

        //
        // set up views
        //

        [cell addSubview:[self cellIcon]];
        [cell addSubview:[self detailsLabel]];
    }

    // Configure the cell...
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];



    //populate each by row.
    NSString *dateDisplay = [self formatDate:[self dateCaught]];
    NSLog (@"date is %@", dateDisplay);
   [[self detailsLabel] setText:[self formatDate:[self dateCaught]]];

    switch (indexPath.row) { //this needs to be an integer, so return the row of the indexPath.
        case 0:
            NSLog (@"text for the cell is %@",[[self detailsLabel]text]);
            break;

        default:
            break;
    }


return cell;

}

4

2 に答える 2

4

問題は、あなたが通り過ぎる方法に関係していますdetailsLabel。あなたはそれをプロパティまたはivarに保持しますself

[self setDetailsLabel:dl];

ただし、セルを再利用できない場合にのみ設定します。セルを再利用すると、detailsLabelonselfが前回の実行のラベルに設定され、あらゆる種類の問題が発生します。

最もクリーンな解決策は、 から派生する独自のクラスを作成しUITableViewCell、ラベル、アイコン、背景色などを作成する初期化コードを指定された初期化子に移動し、ラベル テキストを設定するためのプロパティを作成することです。このクラスを配置すると、次のようにコードを簡素化できます。

UIMyCustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UIMyCustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[[cell detailsLabel] setText:[self formatDate:[self dateCaught]]];
// ^--- detailsLabel can be moved to UIMyCustomTableViewCell now
于 2012-09-01T22:33:00.363 に答える
0

解決策は、のようなメンバー変数を使用せず@property detailsLabel、代わりにすべてのカスタムサブビューのタグを使用することです。次のようにコードを変更します。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            [...]

            // label
            UILabel *dl = [[UILabel alloc]initWithFrame:...];
            dl.tag = 99;
            [cell.contentView addSubview: dl];

            [...]
        }

        [...]

       UILabel *dl = [cell.contentView viewWithTag: 99];
       [dl setText:[self formatDate:[self dateCaught]]];

       [...]
       return cell;
}
于 2012-09-01T22:38:08.997 に答える