2012-02-23 44 views
0

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

在进行导出时,我可以告诉正在使用的文本来确定单元格和标签所需的大小是否正确。它看起来像是正确地确定了一个尺寸(它给我的单元格高度是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

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

经过一番挖掘,我发现当源字符串长度达到41,000左右时,它开始引起此绘图错误。所以我把任何字符串分成了大约30,000,并在表中添加了多行。它现在显示整个文本的墙。

2

这是一个错误:

[label setTag:[indexPath row]]; 

当你构建细胞的视图层次,你永远不应该指的是行号。为什么?因为一个单元格可以重用于不同的行!这就是dequeueReusableCellWithIdentifier:的全部内容。

取而代之的是一个常数为标签的标签:

static const int LabelTag = 100; 

使用常数设置标签:

label.tag = LabelTag; 

后来当你需要获取标签设置其文本,再次使用常数:

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

很高兴知道。这解决了我也在研究的另一个错误。谢谢 – rwakelan 2012-02-23 20:24:38