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

Mat*_*Mat 3 tags iphone ios 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];

    }
Run Code Online (Sandbox Code Playgroud)

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

希望很清楚.谢谢

Rob*_*ill 8

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

[[parentView viewWithTag:tag] removeFromSuperview];
Run Code Online (Sandbox Code Playgroud)

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

  • "脆弱"并不意味着您的代码将在运行过程中停止工作,因为该阵列会自发地改变顺序.这意味着,在将来更改代码时,您可以在数组中添加元素,或更改其顺序.如果您忘记也更新上面的代码,那么它将被破坏.作为一个类比,盒子里的易碎包装在坐在仓库地板上时不会破裂,但是如果搬运工不小心的话,它可能会在搬运时破裂. (3认同)
  • 数组的顺序是子视图的堆叠或z顺序,即数组末尾的视图将在视觉上覆盖数组开头的视图(如果它们重叠). (2认同)