【问题标题】:UITableViewCell with really long text文本很长的 UITableViewCell
【发布时间】:2011-11-23 01:25:33
【问题描述】:

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

  1. 内存
  2. 并不总是显示所有文本(如果太长)
  3. 滚动滞后

关于如何做到这一点的任何想法?我应该尝试使用UITextViews 创建我自己的表来尝试模仿UITableView 的行为吗?有没有一种简单的方法可以用 Apple 的UITableView 来实现它?我还没有看到有这样的应用程序。任何可以帮助我入门的代码?我还必须使用NSAttributedString 进行文本格式化。

更新: 阅读tableView:heightForRowAtIndexPath: 的文档发现了一个重要说明,它回答了这个问题,但不是我的问题。

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

【问题讨论】:

    标签: iphone objective-c uitableview


    【解决方案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; 
    
    
    } 
    

    【讨论】:

    • 我不认为您将代码放在设备上进行测试。首先,您要在 contentview 上已经存在的标签上添加一个额外的标签,因此这对记忆没有帮助。您是否尝试过在几个单元格上使用超过 10,000 个单词?我知道表格是如何工作的,如何动态调整它们的大小,如何将属性分配给字符串等。但不知道如何将它们混合在一起,以便滚动流畅且最重要的是不会导致应用程序崩溃。试试看,如果您有解决方案,请回复我。谢谢
    【解决方案2】:

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

    确保您也自动释放 alloccellForRowAtIndexPath: 中的所有单元格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      相关资源
      最近更新 更多