我有一个应用程序,我添加了一个子视图(并根据用户交互删除相同的子视图)。我正在寻找一种在任何给定时间检查子视图是否存在的方法。
例如:
在当前视图(UIView *viewA
)中,我添加了一个子视图(UIView *viewB
)。然后我想要一种检查在任何给定时间是否显示viewB
的方法。
很抱歉,如果不是很清楚,很难描述。
答案 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)
返回一个布尔值,指示接收者是给定视图的子视图还是与该视图相同。