安全删除包含标签的子视图

时间:2011-10-26 16:22:10

标签: iphone ios tags subviews

这不是一个真正的问题,我只想澄清一下。 我在UIButton上添加了一些子视图(每个按钮都有一个标签),我知道可能有4个或5个子视图。 所以,当我想删除一些子视图(特别是在这种情况下的第4和第5)时:

int cnt=[[(UIView *)[self.scrollView viewWithTag:index] subviews] count];
  if (cnt==4) {
      [[[(UIView *)[self.scrollView viewWithTag:index] subviews] objectAtIndex:3] removeFromSuperview];
  }
  if (cnt==5) {
      [[[(UIView *)[self.scrollView viewWithTag:index] subviews] objectAtIndex:3] removeFromSuperview];
    //[[[(UIView *)[self.scrollView viewWithTag:index] subviews] objectAtIndex:4] removeFromSuperview]; <-- this crash
      [[[(UIView *)[self.scrollView viewWithTag:index] subviews] objectAtIndex:3] removeFromSuperview];

    }

当然,评论行无法执行,因为没有更多5个,但有4个子视图。 所以我必须删除在同一索引上指向两次的视图。 我想知道它是否是一种安全的方法来删除它们,我想确保最后一个视图在数组[[self.scrollView viewWithTag:index] subviews]中向下移动一个位置。

希望很清楚。 感谢

2 个答案:

答案 0 :(得分:8)

如果您知道要删除的视图的标记,那么更安全的方法是:

[[parentView viewWithTag:tag] removeFromSuperview];

在这里,您要求子视图自行删除,而不是要求父视图根据可能出错的某些假定顺序删除子视图。

答案 1 :(得分:4)

我宁愿使用这样的东西:

for(int i=cnt-1;i>=3;i--)
{
  [[[(UIView *)[self.scrollView viewWithTag:index] subviews] objectAtIndex:i] removeFromSuperview];
}

通常,从列表中删除对象时,最安全的方法是从最后开始。这样,如果重组它们就无所谓了。