2 u011073953 u011073953 于 2016.03.01 18:34 提问

removeFromSuperview 不起作用了,奇怪问题

简单上代码吧。
我在更新UIView时候需要先将其中已经存在的一些移除掉

         if ([NSThread currentThread] == [NSThread mainThread]){
            NSLog(@"before remove:%ld", [[self subviews] count]);
            [Helper removeAllSubViews:self];
            NSLog(@"after remove:%ld", [[self subviews] count]);
        }

Helper removeAllSubViews我就不贴代码了,很简单,获取view的subviews,用foreach遍历然后调用removeFromSuperview而已。
很明显我这里确定了这段代码是主线程运行的,但是这样执行仍然没有效果。假如移除之前是4个subview,移除之后还是4个。然后我发现不断更新过程中subview越来越多(每次累计的,没有清除掉之前的),而且由于之前的没有清空成功,全部叠加一起显示特别乱套。
我还特别的看了下系统的注释代码,并没有什么特殊的说明什么情况会移除失败啊。

3个回答

u011073953
u011073953   2016.03.01 20:45
已采纳

竟然又是自己解决了问题,纠结了大半天。
原因很奇葩,是这样的,刚才我想点击进去removeFormSuperView,试试看看苹果关于UIView的注释。然后给我弹出了让我选择是哪一个removeFromSuperview.瞬间反应过来了,因为这个UIView的subviews是一个我自定义类型的UIView,我还在那个View里自己重写了removeFromSuperView.悲剧就这么发生了。我忘记调用super了。怪不得。

ravatar0423
ravatar0423   2016.03.01 19:05

关键的代码你不贴,怎么知道代码有什么问题呢?

u011073953
u011073953   2016.03.01 20:37

还是贴一下代码吧。

 + (void) removeAllSubViews:(UIView *) view{
    NSArray * views = [view subviews];
    for (UIView * v in views){
        [v removeFromSuperview];
    }
}

不过我真的不觉得这里会出问题,我在调试这段代码时候确实是一个一个View的遍历并且调用removeFromSuper 只是调用完了并没有效果

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!