UITableViewCell,文本很长

时间:2011-11-23 01:25:33

标签: iphone objective-c uitableview

我想使用UITableView创建应用的博客部分。该表应该有两个部分和一个分组的样式。第一部分是博客,表格的第二部分是评论。博客可以是任何规模。当输入大量文本时,我的意思是10K字或更多,带有链接或/和照片,应用程序崩溃或根本不显示文本。评论还可以包含大量文本以及链接和照片。似乎UITableView有其局限性。这些是我面临的问题:

  1. 记忆
  2. 并不总是显示所有文本(如果它太长)
  3. 滚动滞后
  4. 关于如何实现这一目标的任何想法?我应该尝试使用UITextViews创建我自己的表来尝试模仿UITableView的行为吗?是否有一种简单的方法可以使用Apple的UITableView来实现它?我还没有看到有这样的应用程序。任何可以帮助我入门的代码?我还必须使用NSAttributedString进行文本格式化。

    更新 阅读tableView:heightForRowAtIndexPath:的文档找到了一个重要的注释,它可以回答问题而不是我的问题。

      

    重要提示:由于底层实施细节,您不应返回大于2009的值。

2 个答案:

答案 0 :(得分:1)

您需要根据文本动态调整表格视图单元格高度。之后,您需要创建一个动态高度取决于文本的标签,并在单元格中添加该标签。

对于内存管理,您需要确保您的单元格是自动释放的,并且您在单元格中添加的子视图也会被重新启用。

这里有一些代码可以帮助您显示整个文本,而不必担心滚动。

假设blogArray是包含要在单元格中显示的文本的数组。(替换为您自己的文本)。

- (UITableViewCell *)tableView:(UITableView *)tbleView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        if([self.blogArray count]>0)
    {
    CGSize labelsize;
    UILabel *blogTextLabel = [[UILabel alloc] init];;
    [blogTextLabel setNumberOfLines:0];
    [blogTextLabel setBackgroundColor:[UIColor clearColor]];
    NSString *text=[self.blogArray objectAtIndex:indexPath.row];
    [blogTextLabel setFont:[UIFont fontWithName:@"Helvetica"size:14]];
    labelsize=[text sizeWithFont: blogTextLabel.font constrainedToSize:CGSizeMake(268, 2000.0) lineBreakMode:UILineBreakModeWordWrap];
    blogTextLabel.frame=CGRectMake(10, 24, 268, labelsize.height);
    blogTextLabel.text=text;
    [cell.contentView addSubview: blogTextLabel];
    [blogTextLabel release];


    }
    else {
    }

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    return cell;
}

您还需要调整表格视图单元格高度: -

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{
    CGSize labelsize;
    UILabel * textDesc1 = [[UILabel alloc] init];
    [textDesc1 setNumberOfLines:0];
    textDesc1.text=[self.blogArray objectAtIndex:indexPath.row];
    [textDesc1 setFont:[UIFont fontWithName:@"Helvetica" size:14.0]];
    labelsize=[textDesc1.text sizeWithFont:textDesc1.font constrainedToSize:CGSizeMake(268, 2000.0) lineBreakMode:UILineBreakModeWordWrap];
    labelsize.height=labelsize.height+35;
    [textDesc1 release];
    return (CGFloat)labelsize.height; 


} 

答案 1 :(得分:0)

确保cellForRowAtIndexPath:数据源方法中reusing cells为{{3}}。这应该确保滚动不会滞后。如果它继续滞后,请确保在绘制单元格时不会阻塞主线程。此外,您可以在UILabel中使用adjustsFontSizeToFitWidthlineBreakMode等属性来控制在任何给定时间显示的文本数量。

确保您自动释放alloc cellForRowAtIndexPath:中{{1}}的所有单元格。