3

こんにちは私はUITableViewにulabelを挿入するために次のコードを使用しています

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

static NSString *CellIdentifier;

CellIdentifier  = [NSString stringWithFormat:@"myTableViewCell %i,%i",
                                [indexPath indexAtPosition:0], [indexPath indexAtPosition:1]];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

        lblNombre= [[UILabel alloc] initWithFrame:CGRectMake(110, 10, 170,40)];
        lblNombre.textColor = [UIColor colorWithRed:90/255.0f green:132/255.0f blue:172/255.0f alpha:1];
        lblNombre.backgroundColor = [UIColor clearColor];
        lblNombre.text=@"Nicolas ahumada";
        lblNombre.numberOfLines=2;
        lblNombre.font = [UIFont fontWithName:@"Magra" size:18.0 ];
         [cell.contentView addSubview:lblNombre ];
}

lblNombre.text=[[jsonpodio valueForKey:@"name"]objectAtIndex:indexPath.row ];
[cell.contentView addSubview:lblNombre ];

return cell;
}

しかし、スクロールしたり、テーブルが再充電されたりすると、UILabelが上書きされます

uilabelが上書きされました

上の画像は上書きされており、下の画像は平均的です。ご協力いただきありがとうございます。

4

5 に答える 5

5

これを試してみてください。セルの再利用ロジックと lblNombre の使用方法に問題があります

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

static NSString *CellIdentifier;

    // use a single Cell Identifier for re-use!
    CellIdentifier  = @"myCell";

    // make lblNombre a local variable!
    UILabel *lblNombre;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        // No re-usable cell, create one here...
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        // get rid of class instance lblNombre, just use local variable!
        lblNombre= [[UILabel alloc] initWithFrame:CGRectMake(110, 10, 170,40)];

        lblNombre.tag = 1001;    // set a tag for this View so you can get at it later

        lblNombre.textColor = [UIColor colorWithRed:90/255.0f green:132/255.0f blue:172/255.0f alpha:1];
        lblNombre.backgroundColor = [UIColor clearColor];
        lblNombre.numberOfLines=2;
        lblNombre.font = [UIFont fontWithName:@"Magra" size:18.0 ];
        [cell.contentView addSubview:lblNombre ];
}
else
{
        // use viewWithTag to find lblNombre in the re-usable cell.contentView
        lblNombre = (UILabel *)[cell.contentView viewWithTag:1001];
}

// finally, always set the label text from your data model
lbl.text=[[jsonpodio valueForKey:@"name"]objectAtIndex:indexPath.row ];


return cell;
}
于 2013-01-14T21:45:20.177 に答える
3

小さくて甘い答えの場合:

サブビューを追加する前に:

このコードを書くだけです:

for(UIView *v in [cell.contentView subviews])
{
   [v removefromsuperview];
}
于 2013-02-12T10:52:11.853 に答える
1

次のコードを試していただけますか

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

static NSString *CellIdentifier;

// Was not sure why you had a reuse identifier which was different for each cell. You created a reuse identifier based on the index. Looks like your cells are all the same looking. So just use a constant string to identify the cell to be used.

CellIdentifier  = [NSString stringWithFormat:@"myTableViewCell"];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.selectionStyle = UITableViewCellSelectionStyleNone;

// Find a subview with a tag of 100 and remove it. See below as to why

[cell viewWithTag:100] removeFromSuperview];

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

// I removed code from here and put it down, assuming that you have a data model which is feeding the data into the label

}


    lblNombre= [[UILabel alloc] initWithFrame:CGRectMake(110, 10, 170,40)];
    lblNombre.textColor = [UIColor colorWithRed:90/255.0f green:132/255.0f blue:172/255.0f alpha:1];
    lblNombre.backgroundColor = [UIColor clearColor];
    lblNombre.numberOfLines=2;
    lblNombre.font = [UIFont fontWithName:@"Magra" size:18.0 ];
     [cell.contentView addSubview:lblNombre ];
    lblNombre.text=[[jsonpodio valueForKey:@"name"]objectAtIndex:indexPath.row ];
    [cell.contentView addSubview:lblNombre ];

// Use  tag or some thing to identify this subview, since you cannot keep on adding subviews. You need to remove it next time you come because you are reusing the cells and you will get back a cell which you created before and that will have the label you added last time
    [lblNombre setTag:100];

    return cell;
}
于 2013-01-14T21:48:11.727 に答える
0

この行を変更します。

    lblNombre= [[UILabel alloc] initWithFrame:CGRectMake(110, 10, 170,40)];

これに:

    UILabel *lblNombre = [[UILabel alloc] initWithFrame:CGRectMake(110, 10, 170,40)];

次にlblNombre、インスタンス変数のリストから削除します(おそらくヘッダーファイルにあります)。

于 2013-01-14T21:39:16.600 に答える
0

ここにコードがあります

NSString *CellIdentifier = [NSString stringWithFormat:@"%ld,%ld",(long)indexPath.section,(long)indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier ];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
于 2017-02-09T10:35:19.893 に答える