Iphone UITableView-由单元本身控制的动态单元高度

Iphone UITableView-由单元本身控制的动态单元高度,iphone,dynamic,uitableview,height,Iphone,Dynamic,Uitableview,Height,我有以下设置:带有自定义UITableViewCell实现的UITableView。在每个单元格中,我都有一个UILabel和一个UIButton。第一次显示表格时,在每个单元格中,UILabel的行数设置为1,所有单元格的高度固定(在我的示例中为60 px)。当点击单元格中的按钮时,UILabel的行数设置为0,并打开换行,从而有效地扩展表格单元格 现在的问题是,只有UITableViewCell的实现才知道标签是否展开,从而知道单元格高度应该是多少。但是,所有者文件是表的数据源 我不知道梅该

我有以下设置:带有自定义UITableViewCell实现的UITableView。在每个单元格中,我都有一个UILabel和一个UIButton。第一次显示表格时,在每个单元格中,UILabel的行数设置为1,所有单元格的高度固定(在我的示例中为60 px)。当点击单元格中的按钮时,UILabel的行数设置为0,并打开换行,从而有效地扩展表格单元格

现在的问题是,只有UITableViewCell的实现才知道标签是否展开,从而知道单元格高度应该是多少。但是,所有者文件是表的数据源

我不知道梅该怎么做。欢迎提出任何意见

更新以下是我的代码摘录

在自定义UITableViewCell实现中:

- (float)requiredHeight
{
    if(isFull)
    {
        CGSize labelSize = [LblTitle.text sizeWithFont: [LblContent font]
                                     constrainedToSize: CGSizeMake(300.0f, 300.0f) 
                                         lineBreakMode: UILineBreakModeTailTruncation];
        return 42.0f + labelSize.height;
    }
    else
    {
        return 60.0f;
    }
}
- (CGFloat)requiredHeight
{
    if(isFull)
    {
        CGSize labelSize = [LblTitle.text sizeWithFont: [LblContent font]
                                     constrainedToSize: CGSizeMake(300.0f, 300.0f) 
                                         lineBreakMode: UILineBreakModeTailTruncation];
        return 42.0f + labelSize.height;
    }
    else
    {
        return 60.0f;
    }
}
在所有者文件(UITableViewDelegate)中:

但是,这会随机导致无限循环或坏访问异常。

在表委托中实现该方法。如果要基于每个单元格定义高度,可以通过在tableView:HeightForRowatineXpath中调用自己的tableView:CellForRowatineXpath:method将此调用“转发”到单元格的类

更新:在代码中实现。错误是由调用tableView:CellForRowatineXpath的委托中的不正确方法签名引起的

在自定义UITableViewCell实现中:

- (float)requiredHeight
{
    if(isFull)
    {
        CGSize labelSize = [LblTitle.text sizeWithFont: [LblContent font]
                                     constrainedToSize: CGSizeMake(300.0f, 300.0f) 
                                         lineBreakMode: UILineBreakModeTailTruncation];
        return 42.0f + labelSize.height;
    }
    else
    {
        return 60.0f;
    }
}
- (CGFloat)requiredHeight
{
    if(isFull)
    {
        CGSize labelSize = [LblTitle.text sizeWithFont: [LblContent font]
                                     constrainedToSize: CGSizeMake(300.0f, 300.0f) 
                                         lineBreakMode: UILineBreakModeTailTruncation];
        return 42.0f + labelSize.height;
    }
    else
    {
        return 60.0f;
    }
}
在所有者文件(UITableViewDelegate)中:


好吧,经过一番挣扎后,我得到了这样的结果,哪种方法有效

  • 我创建了一个简单的类来包含与一个单元格相关的信息:
  • 不要过分担心所有的属性-最重要的是
    高度

  • 在我的控制器(也是表视图的委托)中,我将数据保存为指向类型为
    CommentInfo
    的对象的指针的
    NSMutableArray

  • cellforrowatinexpath
    中,我获取相应的指针,并在构建期间将其传递给自定义单元格实现,并将其存储在其中。我还将
    self
    设置为单元格的委托

  • 在自定义单元格实现中,当需要展开/更改高度时,我会更新
    CommentInfo
    对象中的
    height
    属性,并调用代理中的方法来更新显示

  • 调用此
    updateDisplay
    方法时,我只需执行以下操作:

  • heightforrowatinexpath
    方法中,我检索指向
    CommentInfo
    的相应指针,并读取
    Height
    属性。由于控制器和单元格之间的指针相同,因此对该属性的任何更改都将在这两个类中可见

  • 工作完成。

    我想我没有遵循你的逻辑。我已经定义了
    HeightForRowatineXpath
    ,在其中我试图获取indexpath处的单元格,然后调用其中的一个方法来返回所需的路径,但是这会导致错误的\u访问\u异常。本质上,表是通过方法tableView:HeightForRowatineXpath:“X行应该有多高?”来询问UITableViewDelegate。您应该返回所需高度(以像素为单位)的CGFloat,而不是索引路径。@JacobJinnings:您似乎误读了我的代码。对于“X行应该有多高”,我试图获取X行并询问它应该有多高,然后返回该值。请仔细查看代码。我在UITableViewCell中使用UIWebView,因此调用heightForRowAtIndexPath时它无法判断高度。我要做的是将单元格设置为UIWebView的委托,并在webViewDidFinishLoad方法中调用[webView sizeToFit];webView.hidden=否;[tableViewController setRowHeight:webView.bounds.size.height for RowId:id];在UITableViewController的setRowHeight方法中,我调用您提供的两个方法:[tableView BeginUpdate];[tableView EndUpdate];它是有效的。
    @interface CommentInfo : NSObject
    {
        int ID;
        NSString *Name;
        NSString *Date;
        NSString *Content;
        BOOL IsFull;
        float Height;
    }
    
    @property (readonly) int ID;
    @property (readonly) NSString *Name;
    @property (readonly) NSString *Date;
    @property (readonly) NSString *Content;
    @property (readwrite, assign) float Height;
    @property (readwrite, assign) BOOL IsFull;
    
    - (id)initWithID:(int)_id withName:(NSString *)_name withDate:(NSString *)_date withText:(NSString *)_text;
    
    @end
    
    [CommentsTable beginUpdates];
    [CommentsTable endUpdates];