检查子视图是否在视图中


97

我在做一个应用程序,我一个子视图添加到使用视图addSubview:IBAction。同样,当IBAction再次触摸带有该按钮的按钮时,应调用removeFromSuperview添加在该子视图上的该子视图IBAction

伪代码

-(IBAction)showPopup:(id)sender 
{
    System_monitorAppDelegate *delegate = (System_monitorAppDelegate *)[[UIApplication sharedApplication] delegate];
    UIView *rootView = delegate.window.rootViewController.view;

    if([self popoverView] is not on rootView) 
    { 
        [rootView addSubview:[self popoverView]];
    } 
    else 
    {
        [[self popoverView] removeFromSuperview];
    }

}

Answers:


271

您可能正在寻找的UIView的-(BOOL)isDescendantOfView:(UIView *)view;在采取UIView类参考

如果接收方是视图的直接或远方子视图,或者如果视图是接收方本身,则返回值 YES。否则没有。

您最终将得到如下代码:

物镜

- (IBAction)showPopup:(id)sender {
    if(![self.myView isDescendantOfView:self.view]) { 
        [self.view addSubview:self.myView];
    } else {
        [self.myView removeFromSuperview];
    }
}

迅捷3

@IBAction func showPopup(sender: AnyObject) {
    if !self.myView.isDescendant(of: self.view) {
        self.view.addSubview(self.myView)
    } else {
        self.myView.removeFromSuperview()
    }
}

2
不起作用,仅在其上添加视图。我将编辑代码以显示实际情况
pmerino's

@ zad0xsis-我不了解实际情况。如果您使用addSubview:方法添加第二个视图(第一次可能是这种情况),那么下次,您将到达else部分,因为第二个视图现在是第一个的子视图。那不是你想做的吗?您可能正在寻找另一种机制,例如以模态方式呈现视图控制器?

好吧,popoverView是rootView(rootViewController)的子视图。我想检查它是否在屏幕上(如果它具有rootView作为超级视图),如果要删除它,否则请添加它
pmerino 2011年

[self popoverView]返回一个新的每次酥料饼产生的?如果它是同一视图,则不能在其上方添加视图,而添加已经存在无操作的视图。如果该popoverView方法每次都创建一个新方法,则它将始终不在视图层次结构中
bshirley 2011年

1
让我绊倒的一个重要考虑因素是:在删除然后添加要使用IBOutlet属性(或ivars)保留的子视图时,您需要确保属性(ivars)是牢固的,或者要保留它们(在ARC之前) 。默认情况下,如果您从视图ctrl拖动到控制器以创建插座,则它将创建为插座,因为它假定在笔尖中创建的视图将拥有它,因此您不需要强引用。但是,如果您随后以编程方式将其删除,它将取消分配控件并将您的引用设置为nil(在ARC中)。
大黄

18

试试这个:

-(IBAction)showPopup:(id)sender
{
    if (!myView.superview)
        [self.view addSubview:myView];
    else
        [myView removeFromSuperview];
}

太棒了!有时它需要myView.view.superview,但对我来说却像魔术一样。感谢@MarkGranoff
Lior Frenkel


4

Swift的等效项如下所示:

if(!myView.isDescendantOfView(self.view)) {
    self.view.addSubview(myView)
} else {
    myView.removeFromSuperview()
}

2

检查子视图的超级视图...

-(IBAction)showPopup:(id)sender {
    if([[self myView] superview] == self.view) { 
        [[self myView] removeFromSuperview];           
    } else {
        [self.view addSubview:[self myView]];         
    }
}

1

您的条件是否应该像

if (!([rootView subviews] containsObject:[self popoverView])) { 
    [rootView addSubview:[self popoverView]];
} else {
    [[self popoverView] removeFromSuperview];

}

这是对迈克尔·弗雷德里克的回答的轻微修改。与使用Vincent的代码得出的结果是否有所不同isDescendantOfView:
paulmelnikow 2011年

绝对会产生不同的结果。这只是检查是否是一个子视图,而不是一个孙子或曾孙等
萨米Samhuri

0

在这里,我们使用了两种不同的观点。父视图是我们要在其中搜索后代视图并检查是否添加到父视图的视图。

if parentView.subviews.contains(descendantView) {
   // descendant view added to the parent view.
}else{
  // descendant view not added to the parent view.
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.