问题 什么时候为自定义UITableViewCell调用layoutSubviews?


什么时候 layoutSubviews 在自定义上调用 UITableViewCell 在一个 UITableViewCells  cellForRowAtIndexPath 方法?下面,我需要 layoutSubviews 在我设置后被称为 FiltersTableViewCellItem 属性。我是否正确设置了此设置?我希望能够使用 layoutSubviews 因为我听说它的性能更好。

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"FiltersTableViewCell";
    FiltersTableViewCell *filtersTableViewCell = [[self dequeueReusableCellWithIdentifier:cellIdentifier] retain];
    FiltersTableViewCellItem *filtersTableViewCellItem = [[self.filtersTableViewCellItems objectAtIndex:[indexPath row]] retain];

    if (!filtersTableViewCell)
    {
        filtersTableViewCell = [[FiltersTableViewCell alloc] initWithFiltersTableViewCellItem:filtersTableViewCellItem];
        filtersTableViewCell.delegate = self;
    }
    else
    {
        filtersTableViewCell.filtersTableViewCellItem = filtersTableViewCellItem;
    }
    return [filtersTableViewCell autorelease];
}

9305
2018-02-01 06:02


起源

@Danny Lin ARC与性能改进无关。事实上它与自动释放具有很多相同的效果。 - Jon Trauntvein


答案:


layoutSubviews 在之后的某个时刻被召唤 tableView:willDisplayCell:,之后被称为 tableView:cellForRowAtIndexPath:。您可以通过在相关方法中设置断点并查看它们的命中顺序来验证这一点。例如,在结尾处设置断点 tableView:cellForRowAtIndexPath:。然后添加以下方法 FiltersTableViewCell

- (void)layoutSubviews
{
    [super layoutSubviews];
}

并在那里设置一个断点。然后运行应用程序,看看会发生什么。


15
2018-02-01 08:32



但请注意,即使 layoutSubviews 被称为 willDisplayCell,这并不意味着当布局为了自我调整而通过时就完成了。我发现一个自填式单元,直到没有填充 willDisplayCell 没有得到正确的高度,即使它也通过调用强制布局传递 layoutIfNeeded。我不得不改变我的代码来填充 cellForRowAtIndexPath 而是自我调整工作。 - Pierre Houston
@PierreHouston你能告诉我如何在单元格加载时在UITableViewCell中获取UIButton的大小,因为我想根据内容减小UIButton高度的大小。我在iPhone 8中制作了Custom Cell。在iPhone 5中,我得到的UIButton大小与iPhone 8相同。请帮帮我 - Ankur Patel


设置项目后尝试调用setNeedsLayout。

filtersTableViewCell.filtersTableViewCellItem = filtersTableViewCellItem;
[filtersTableViewCell setNeedsLayout];

1
2018-06-28 18:40





正如本文所述 回答 , 有很多情况会被调用。我还会说,当可重用项目从可重用单元队列中出列时,可能会调用它。尝试在查找可重用项之前设置FiltersTableViewCellItem。


-1
2018-02-01 07:14