iphone - UITableViewCell 不显示文本

标签 iphone objective-c ios ios4

我有一个小应用程序,它列出了数据库中的一堆项目。如果您单击其中一项,应用程序会切换到一个新 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/

相关文章:

iphone - 带有 UIButton 和 UITapGestureRecognizer 的 UIScrollView

iphone - 如何从地址簿联系人获取电话号码 (iphone sdk)

objective-c - Objective C self.variable 和变量赋值之间的区别

ios - 如何在警告框上显示日期和时间

ios - 字段 `lyrics` 对于 swift 中当前播放歌曲的 MPMediaItem 是空的,ios 12+

ios - 快速检查 3D Touch 是否可用

ios - Flutter 应用程序在 iOS 平台的 firebase 电话身份验证中崩溃

ios - 我如何解决 IOS 版本 React Native 应用程序中的 EXC_CRASH (SIGABRT) 问题?

ios - Spotify iOS SDK Beta 25 在真实设备上没有声音

objective-c - 将数组传递给导航类型应用程序中的父 View Controller