gpt4 book ai didi

iphone - 标签文字困惑

转载 作者:行者123 更新时间:2023-12-01 17:58:31 26 4
gpt4 key购买 nike

下面显示的tableView包含label。它们被添加为每个单元格的subView

当我第一次运行程序时,屏幕上显示的单元格具有正确的文本。但是,当我滚动表格时,标签中的文本开始变得混乱。据我了解,创建一个单元格时,一个单元格的标签会覆盖另一个单元格的顶部。这已在后两个屏幕截图中显示。每次滚动之后,不同的单元格会相互叠加。 (因此,没有固定的模式。)我试图通过观察哪个单元格正在退出屏幕以及哪个单元格正在进入来了解问题。我试图将这些信息与单元格上的标签相关联,但我无法理解。

谨请您帮助我了解造成这种差异的原因。

谢谢!

我的代码的相关部分如下:

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

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

NSLog(@"s = %d, r = %d", indexPath.section, indexPath.row);

if (indexPath.section == 0)
{
switch(indexPath.row)
{
case 0:
[cell addSubview:classA];
break;

case 1:
[cell addSubview:classB];
break;

case 2:
[cell addSubview:classC];
break;

case 3:
[cell addSubview:classD];
break;

case 4:
[cell addSubview:classE];
break;

default:
break;
}
}

if(indexPath.section == 1)
{
switch(indexPath.row)
{
case 0:
[cell addSubview:classF];
break;

case 1:
[cell addSubview:classG];
break;

case 2:
[cell addSubview:classH];
break;

default:
break;
}
}

if(indexPath.section == 2)
{
switch (indexPath.row)
{
case 0:
[cell addSubview:classI];
break;

case 1:
[cell addSubview:classJ];
break;

case 2:
[cell addSubview:classK];
break;

default:
break;
}
}

return cell;
}

最佳答案

原因是,您正在使用dequeueReusableCellWithIdentifier重用单元格。因此,在滚动时,超出可见区域的单元格将重新用于当前的可见单元格。

由于您已经在这些单元格中添加了诸如classB等的标签,并且此后并未删除,之后,当您在相同的重用单元格中添加诸如classI等的标签时,它将被绘制在此标签之上。由于这些标签将背景色设置为透明色,因此也会显示在其后面绘制的标签,因此具有重叠感。

根据屏幕截图,所有单元格看起来都一样,您可以肯定地使用dequeueReusableCellWithIdentifier重用这些单元格。那么,为什么不更改在cellForRowAtIndexPath之外创建标签的逻辑,而只是在此方法内的相应if条件中将其用作cell.TextLabel.text = @"Class B";等呢?

您的代码将如下所示:

if (indexPath.section == 0)
{
switch(indexPath.row)
{
case 0:
cell.textLabel = [self createLabelForRow:indexPath.row section:indexPath.section];
//or if it is jut a simple label, you can just set font and other properties in cell.textLabel directly
cell.textLabel.text = @"Class A";
break;

更新:如果所有单元格都是静态的,这是对 dequeueReusableCellWithIdentifier重用的不太好的修复。但这不是推荐的方法。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

NSString *CellIdentifier = [NSString stringWithFormat:@"CellForRow%dSection%d",indexPath.row, indexPath.section];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
   }

//or try this

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

Update2:因此,如果您遇到上述问题,请尝试此操作。使用我的第一种方法并执行以下操作。
if (indexPath.section == 0)
{
switch(indexPath.row)
{
case 0:
cell.textLabel = [self createLabelForRow:indexPath.row section:indexPath.section];

// or do the following,

[self removeAllTextFieldsFromCell:cell];
UITextField *aTextField = [self createTextFieldForRow:indexPath.row section:indexPath.section];
[cell.contentView addSubview:aTextField];
}

removeAllTextFieldsFromCell:方法中,使用R.A的建议。

例如:
- (void)removeAllTextFieldsFromCell:(UITableViewCell *)cell {

for (UITextField *textField in cell.contentViews.subViews) {
[textField removeFromSuperView];
}
}

或只是使用,
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

NSLog(@"s = %d, r = %d", indexPath.section, indexPath.row);

//if it is all textfields in the cell, it will look like,
[self removeAllTextFieldsFromCell:cell];
UITextField *aTextField = [self createTextFieldForRow:indexPath.row section:indexPath.section];
[cell.contentView addSubview:aTextField];

return cell;
}

关于iphone - 标签文字困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13460535/

26 4 0