如何检查UIView是否是父视图的子视图

时间:2011-10-16 19:54:19

标签: iphone objective-c uiview subview

我有一个应用程序,我添加了一个子视图(并根据用户交互删除相同的子视图)。我正在寻找一种在任何给定时间检查子视图是否存在的方法。

例如:

在当前视图(UIView *viewA)中,我添加了一个子视图(UIView *viewB)。然后我想要一种检查在任何给定时间是否显示viewB的方法。

很抱歉,如果不是很清楚,很难描述。

4 个答案:

答案 0 :(得分:41)

UIView存储其超级视图,只需尝试{/ 3}即可访问

if([viewB superview]!=nil)
    NSLog(@"visible");
else
    NSLog(@"not visible");

但更好的方法是使用UIView

superview-property

答案 1 :(得分:13)

我经历了同样的问题并咨询了Apple Documentation并提出了这个优雅的解决方案:

if([self.childView isDescendantOfView:self.parentView])
{
    // The childView is contained in the parentView.
}

答案 2 :(得分:2)

这是我在appDelegate中放置的方法,以便我可以从任何点显示整个子视图层次结构。

// useful debugging method - send it a view and it will log all subviews
// can be called from the debugger
- (void) viewAllSubviews:(UIView *) topView Indent:(NSString *) indent  {
    for (UIView * theView in [topView subviews]){
        NSLog(@"%@%@", indent, theView);
        if ([theView subviews] != nil)
            [self viewAllSubviews:theView Indent: [NSString stringWithFormat:@"%@ ",indent]];
    }
}

用一个带有一个字符的字符串调用它,它会缩进给你。 (即[appDelegate viewAllSubviews:self.view Indent:@" "];

我发现首先清除调试窗格很有用,然后从调试器中调用它,并将其复制到文本编辑器中,如BBEdit,它将显示缩进。

您可以使用mainWindow的视图调用它,并查看屏幕上的所有内容。

答案 3 :(得分:0)

我更新到Swift4,非常感谢@Shinnyx和@thomas。

if viewB.superview != nil{     
    print("visible")
}
else{
   print("not visible")
}
if selfView.isDescendant(of: self.parentView) {
    print("visible")
}
else{
    print("not visible")
}
  

func isDescendant(of:UIView)

     

返回一个布尔值,指示接收者是给定视图的子视图还是与该视图相同。