gpt4 book ai didi

iphone - UITableViewCell 不显示文本

转载 作者:行者123 更新时间:2023-11-28 23:05:11 29 4
gpt4 key购买 nike

我有一个小应用程序,它列出了数据库中的一堆项目。如果您单击其中一项,应用程序会切换到一个新 View ,向您显示有关该特定项目的所有信息。由于显示的信息量是动态的,我通过将第二个 View 设为 UITableView 并根据显示的特定对象的需要设置每行的大小来实现这一点。这通常工作正常,但其中一个项目的最后显示的项目有一堵文字墙。当我尝试查看关于这个特定对象的信息时,它没有显示任何应该是文本墙的地方。

在调试时,我可以判断用于确定单元格和标签所需大小的文本是正确的。它似乎正确地确定了一个大小(它为我提供了 21298 的单元格高度和 21294 的标签高度),我可以向下滚动到一个看起来相当大的空标签。但是,显示有点乱,就好像屏幕在刷新一样。 View 顶部的文本从开始到屏幕顶部的位置断断续续,右侧的滚动条也没有正确重绘。

有人以前见过这样的东西吗?

抱歉,因为我没有足够的代表,所以无法发布我的屏幕截图

编辑:找出答案。最短时间过去后,我会将其作为答案发布。

如果其他人遇到这个问题,我想出了一个解决方法。

经过深入研究,我发现当源字符串长度达到 41,000 左右时,它开始导致此绘图错误。所以我拆分了超过 ~30,000 的任何字符串,并向表中添加了多行。它现在显示整个文本墙。

代码:

#define FONT_SIZE 14.0f
#define CELL_CONTENT_WIDTH 320.0f
#define CELL_CONTENT_MARGIN 2.0f

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//static NSString *CellIdentifier = @"Cell";
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d", [indexPath row]];
UILabel *label = nil;

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

label = [[UILabel alloc] initWithFrame:CGRectZero];
[label setLineBreakMode:UILineBreakModeWordWrap];
[label setMinimumFontSize:10.0];
[label setNumberOfLines:0];
[label setFont:[UIFont systemFontOfSize:FONT_SIZE]];
[label setTag:1];

if ([indexPath row] == 1 || [indexPath row] == 2)
{
[label setTextColor:[UIColor redColor]];
}
else if ([indexPath row] == 3)
{
[label setTextColor:[UIColor colorWithRed:0.0f green:150.f/255.f blue:30.f/255.f alpha:1.0f]];
}
else if ([indexPath row] == 5)
{
[label setTextColor:[UIColor colorWithRed:155.f/255.f green:145.f/255.f blue:0.0f alpha:1.0f]];
}

[[cell contentView] addSubview:label];
}

NSString *text = [cardInfo objectAtIndex:[indexPath row]];

CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN *2), 20000000000000.0f);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

if (!label)
{
label = (UILabel *)[cell.contentView viewWithTag:1];
}

[label setText:text];
[label setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN *2), MAX(size.height, 30.0f))];

// Configure the cell...

return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *text = [cardInfo objectAtIndex:[indexPath row]];
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN *2), 20000000000000.0f);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
CGFloat height = MAX(size.height, 30.0f);
return height + (CELL_CONTENT_MARGIN * 2);
}

最佳答案

这是一个错误:

[label setTag:[indexPath row]];

当您构建单元格的 View 层次结构时,您永远不应引用行号。为什么?因为一个单元格可以重复用于不同的行!这就是 dequeueReusableCellWithIdentifier: 的全部内容。

相反,为标签的标签定义一个常量:

static const int LabelTag = 100;

使用该常量设置标签:

label.tag = LabelTag;

稍后当您需要获取标签来设置其文本时,再次使用常量:

label = (UILabel *)[cell.contentView viewWithTag:LabelTag];

关于iphone - UITableViewCell 不显示文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9420428/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com