UITableView“dequeueReusableCellWithIdentifier”导致基于单元格内容的动态单元格高度的单元格重叠?

Posted

技术标签:

【中文标题】UITableView“dequeueReusableCellWithIdentifier”导致基于单元格内容的动态单元格高度的单元格重叠?【英文标题】:UITableView "dequeueReusableCellWithIdentifier" cause the cell overlap for dynamic cell height based on cell content? 【发布时间】:2014-04-20 00:50:23 【问题描述】:

这是我的代码,在我的应用程序中,我为 UITableView 中的每个单元格使用自定义 UITableViewCell,并计算“heightForRowAtIndexPath”中的单元格高度,但如果我使用“dequeueReusableCellWithIdentifier”,滚动表格时单元格会重叠看法。当不使用“dequeueReusableCellWithIdentifier”时问题消失了。不知道为什么会出现这个问题?

实际上,我想知道如果不使用“dequeueReusableCellWithIdentifier”创建单元格,如果tableview显示很多单元格会导致内存问题吗?

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

#warning Incomplete method implementation.
    // Return the number of rows in the section.

    return 10;



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



    static NSString* cellIdentifier = @"threadCell";
    SYGBBSTableViewCell * cell=nil;

    //if I comment below line code , the cell overlap issue solved 
    cell = (SYGBBSTableViewCell*) [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil) 
        cell = [[SYGBBSTableViewCell alloc] initMessagingCellWithReuseIdentifier:cellIdentifier];
    

    [self configureCell:cell atIndexPath:indexPath];





    return cell;




-(void)configureCell:(SYGBBSTableViewCell*)cell atIndexPath:(NSIndexPath *)indexPath 

    SYGBBSTableViewCell* ccell = (SYGBBSTableViewCell*)cell;

    ...
    cell.content.text=content;










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

    /// Here you can set also height according to your section and row
    NSDictionary* thread = [MyGoController getBBSThreadAtIndex:indexPath.row];

    int height = [SYGBBSTableViewCell cellHeightForThreadAt:thread];
    return height;

【问题讨论】:

你不需要检查if (cell == nil) @meda 我认为他这样做是为了可以在出列行中注释/注释以进行测试。 @sureone,IB中原型单元格的类是否设置为SYGBBSTableViewCell?如果不是,那就可以解释问题了。 它不在IB中,并且单元格中有两个UILabel,我在UITableViewCell子类的“initMessagingCellWithReuseIdentifier”中编程添加。 实际上,我想知道如果不使用“dequeueReusableCellWithIdentifier”来创建单元格,如果tableview显示很多单元格,是否会导致任何内存问题? 【参考方案1】:

问题在于,当您使用dequeueReusableCellWithIdentifier 获取单元格时,它不会调用您的初始化程序initMessagingCellWithReuseIdentifier。 将initMessagingCellWithReuseIdentifier 重命名为initWithStyle:reuseIdentifier:,它应该可以工作。

注意initWithStyle:reuseIdentifier: 是指定的初始化器(文档:https://developer.apple.com/library/ios/documentation/uikit/reference/UITableViewCell_Class/Reference/Reference.html),你应该调用[super initWithStyle:style reuseIdentifier:reuseIdentifier];。之后,在initMessagingCellWithReuseIdentifier中实现你现在正在实现的逻辑。

【讨论】:

【参考方案2】:

dequeueReusableCellWithIdentifier 对单元格重用很有用,你应该检查cell == nil,除非你使用- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath 来获得可重用单元格。我认为问题出在configureCell,因为单元格高度会发生变化,您也应该配置适当高度的单元格,您可以在configureCell 方法中尝试这样的代码:

-(void)configureCell:(SYGBBSTableViewCell*)cell atIndexPath:(NSIndexPath *)indexPath 

    SYGBBSTableViewCell* cell = (SYGBBSTableViewCell*)cell;
    CGFloat cellHeight = [self tableView:self.tableView heightForRowAtIndexPath:indexPath];

    [cell layoutSubviewWithHeight:cellHeight];
    [cell configureContent];

【讨论】:

以上是关于UITableView“dequeueReusableCellWithIdentifier”导致基于单元格内容的动态单元格高度的单元格重叠?的主要内容,如果未能解决你的问题,请参考以下文章

将 UITableView 推送到 UITableView

UItableview 单元格的动态高度与 UItableview 单元格内的 UItableview

UITableView

水平 UITableView 中的垂直 UITableView

如何与重叠显示的 UITableView 交互另一个 UITableView

在 UITableView 中的 UINib 中重新加载 UITableView