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