2011-10-26 82 views
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

我宁愿使用这样的:

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

通常情况下,从列表中删除对象时,最安全的方法是开始的结束。这样,即使重组,也无关紧要。

8

如果你知道的,你要删除,然后这样做的更安全的方式的意见标签是:

[[parentView viewWithTag:tag] removeFromSuperview]; 

这里你问子视图删除自身,而不是要求父视图根据一些可能错误的假定顺序来移除孩子。

+0

此外,如果不使用特定标签查看视图,它只会返回零,您可以调用您喜欢的任何方法。 – jrturton

+0

感谢您的回应,我知道这一点,但儿童子视图没有标签,我只知道可能有4或5个子视图。 – Mat

+0

通过一些假设的顺序访问您的孩子的意见听起来对我来说真的很脆弱。给它们加标签或者用其他方法来标识它们(例如,在实例变量或字典中保持对它们的引用) –