在 UICollectionViewCell 的子视图上调用 removeFromSuperview 在第一次加载时不起作用,仅当单元格被重用时

Calling removeFromSuperview on subview in UICollectionViewCell does not work on first load, only when cell is reused

我有一个包含多个子视图的集合视图单元格。我想完全删除其中一个子视图,以便相邻的子视图可以扩展以通过约束填充 space。

这个约束配置在故事板的原型单元中设置,子视图已经在原型中,准备在单元实例化后移除。

我的 UICollectionViewCell 子类有一个 setter 这样做:

- (void)setThing:(NSString *)aThing
{
     if (!aThing)
     {
          [self.thingContainerView removeFromSuperview];
          return;
     }
     // proceed if aThing exists

设置单元格后:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"mycellid" forIndexPath:indexPath];
    cell.aThing = nil; //this should trigger removal of one of the cell's subviews
    return cell;
}     

问题是 UICollectionViewCell 第一次加载时,子视图没有被删除。 一旦我将单元格滚动到屏幕外并返回到它,子视图已按预期删除。所以我假设当我第一次设置 属性 时,单元格没有完全布局存在某种问题。

如何让它工作?

我认为此时视图尚未布局,因此无法删除子视图。尝试用不同的方法删除它,例如;

- (void) didMoveToSuperview
{
    if (!self.aThing)
    {
         [self.thingContainerView removeFromSuperview];
    }
}

这将在您的集合视图单元格中被覆盖。

可能有更合适的方法来调用它,但这应该有效。