我有一个小应用程序,列出了数据库中的一堆项目。如果单击其中一个项目,应用程序将切换到新视图,该视图将显示有关该特定项目的所有信息。由于显示的信息量是动态的,我通过使第二个视图成为UITableView并根据所显示的特定对象的需要设置每行的大小来实现。这通常可以正常工作,但其中一个项目有最后一项显示的文本墙。当我尝试查看有关此特定对象的信息时,它不会显示文本墙应该显示的任何内容。
虽然dubugging我可以告诉用于确定单元格和标签所需大小的文本是正确的。它似乎正确地确定了一个大小(它给了我一个21298的单元格和21294的标签),我可以向下滚动到看起来像是一个相当大的空标签。然而,显示有点混乱,几乎就像屏幕是清爽的。视图顶部的文本从开始一直到屏幕顶部的位置断断续续,右侧的滚动条也没有正确重新显示。
之前有人见过这样的事吗?
抱歉,由于我没有足够的代表,我无法发布截图
编辑:找出答案。一旦最短时间过去,我会将其作为答案发布。我想出了一个解决方法,如果有其他人遇到这个问题。
经过一番挖掘,我发现当源字符串长度达到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);
}
答案 0 :(得分:2)
这是一个错误:
[label setTag:[indexPath row]];
构建单元格的视图层次结构时,不应该引用行号。为什么?因为一个单元可以重用于不同的行!这就是dequeueReusableCellWithIdentifier:
的全部内容。
相反,为标签的标签定义一个常量:
static const int LabelTag = 100;
使用该常量设置标记:
label.tag = LabelTag;
以后需要获取标签以设置其文本时,再次使用常量:
label = (UILabel *)[cell.contentView viewWithTag:LabelTag];
答案 1 :(得分:0)
我想出了一个解决方法,如果有其他人遇到这个问题。
经过一番挖掘,我发现当源字符串长度达到41,000左右时,它会开始导致此绘图错误。所以我将任意字符串分成~30,000,并在表格中添加了多行。它现在显示整个文本墙。