3

这不是一个真正的问题,我只想澄清一下。我在 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]

希望很清楚。谢谢

4

2 回答 2

8

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

[[parentView viewWithTag:tag] removeFromSuperview];

在这里,您要求子视图删除自己,而不是要求父视图根据一些可能错误的假设顺序删除子视图。

于 2011-10-26T16:37:43.263 回答
4

我宁愿使用这样的东西:

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

通常,从列表中删除对象时,最安全的方法是从末尾开始。这样,即使他们被重组也没关系。

于 2011-10-26T16:37:34.060 回答