UITableView“dequeueReusableCellWithIdentifier”根据单元格内容导致单元格重叠动态单元格高度?

时间:2014-04-20 00:50:24

标签: ios uitableview

这是我的代码,在我的应用程序中,我为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;
}

2 个答案:

答案 0 :(得分:0)

问题在于,当您使用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中实现的逻辑。

答案 1 :(得分:0)

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];
}