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

时间:2015-05-21 12:58:46

标签: ios uicollectionview uicollectionviewcell

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

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

我的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时,子视图尚未删除。一旦我将屏幕上的单元格滚动并返回给它,则子视图已被删除按预期删除。因此,当我第一次设置属性时,我认为单元格没有完全布局存在某种问题。

如何让它发挥作用?

1 个答案:

答案 0 :(得分:1)

我不认为该视图已经布局,因此无法删除子视图。尝试使用其他方法删除它,例如;

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

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

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