从 SuperView 中删除子视图的问题 - Objective-C

Posted

技术标签:

【中文标题】从 SuperView 中删除子视图的问题 - Objective-C【英文标题】:Problems Removing Subview from SuperView - Objective-C 【发布时间】:2013-10-07 09:20:23 【问题描述】:

不确定为什么无法从父视图中删除添加的子视图。如果长按操作结束,我希望将其删除。我用 NSLog 进行了测试,我知道手势正确注册为结束,但它没有删除子视图。

-(void)addSubview:(UILongPressGestureRecognizer *)gesture 
    NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"overlayView" owner:self     options:nil];
    UIView *subView = [subviewArray objectAtIndex:0];

    if (gesture.state == UIGestureRecognizerStateBegan) 
        [self.view addSubview:subView];
        
    if (gesture.state == UIGestureRecognizerStateEnded) 
        [subView removeFromSuperview];
            

所需功能:

长按开始:添加子视图。 长按结束:删除子视图。

【问题讨论】:

尝试在 [subView removeFromSuperview] 行添加一个断点只是为了检查哪个视图在那里,确保它不为零。我认为这不起作用的唯一原因是您没有获得对正确视图或任何视图的引用。 是的,它没有获得正确的超级视图,但我不确定如何具体调用它。也许我没有正确添加超级视图? 查看其他人的答案,当他们说您没有对子视图的引用时,他们感到很困惑。我会选择@Utkarsh Goel 的回答,这似乎是正确的 【参考方案1】:

我希望您可以通过在 .h 文件中声明 UIView *subview 然后在 viewDidLoad 中放入以下行来解决此问题:

 NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"overlayView" owner:self     options:nil];
    UIView *subView = [subviewArray objectAtIndex:0];

然后:

-(void)addSubview:(UILongPressGestureRecognizer *)gesture 
    if (gesture.state == UIGestureRecognizerStateBegan) 
        [self.view addSubview:subView];
        
    if (gesture.state == UIGestureRecognizerStateEnded) 
        [subView removeFromSuperview];
            

【讨论】:

成功了!每次触发手势事件时我都在重新创建视图的问题是什么? 是的,这就是@Wain 提到的。如果您要加载新的视图实例,对屏幕上的实例的引用会丢失,因此不会像那样简单地删除它。

以上是关于从 SuperView 中删除子视图的问题 - Objective-C的主要内容,如果未能解决你的问题,请参考以下文章

无法从 superview-Xcode6 中删除子视图

当内部按钮触摸时,如何从 Superview 中删除以编程方式创建的子视图?

从SuperView的ViewController外部的类调用时,willRemoveSubview不会删除子视图吗?

从其 superView 中删除 UIView 并将其框架扩展到全屏

添加删除的子视图 Swift 3 iOS

如何从 iPad 中的子视图更新 Superview?