在Swift 1.2中检查子视图是否存在

5

我使用以下代码添加了我的子视图:

self.view.addSubview(noticeSubView)

在某些情况下,我需要在执行其他操作之前检查子视图是否存在。我搜索时找到了以下内容,但不确定这是否是正确的方法以及如何实现。

BOOL doesContain = [self.view.subviews containsObject:pageShadowView];

我感激任何帮助,谢谢。


isDescendantOfView() ? - some_id
3个回答

22
与其问一个子视图是否存在于您的视图中,您最好询问该子视图(在您的情况下为noticeSubView)是否具有一个父视图,该父视图是您的视图。
因此,在您的示例中,您稍后将检查以下内容:
if ( noticeSubView.superview === self.view ) {
  ...
}

三个等号 "===" 确保superview对象是self.view相同的对象,而不是尝试在视图上调用isEqual()方法。

过去人们使用的另一种方法是给子视图设置一个整数标签,如下所示:

noticeSubView.tag = 4

默认为零,因此任何非零值都将是唯一的。

然后,您可以通过标签检查超级视图是否包含特定视图:

if ( self.view?.viewWithTag(4) != nil )
...
}

如果您采用这种方法,您应该为整数值创建一个枚举,以便更清楚地了解您要查找的内容。

注意:在 viewDidLoad 之后视图控制器才会定义视图,因此在 self.view 后面有一个 "?",它确保调用不会发生如果 self.view 返回 .None


非常感谢,正是我所需要的。 - john tully
如果(noticeSubView.superview === self.view){ ... }而isDescendentOf两者都会崩溃。我猜这是因为我从未初始化我的子视图。但它不应该只返回nil吗?我的意思是,它们被声明为var frontCardView:SwipeChartView! - Ace Green
在Swift中,它在viewDidLoad之前返回nil,这会导致崩溃,因为VC的视图是一个强制可选项,这意味着它假设它已经存在 - 这很危险。尝试使用self.view?.viewWithTag(4),它将正确返回一个可选项以进行检查,而不会导致崩溃。我会更新我的答案。然而,如果你看到self.view还没有设置,你需要找到在视图加载后放置这段代码的地方。尝试使用viewDidLoad或viewWillAppear而不是Init。 - Kendall Helmstetter Gelner

2
如果noticeSubView是一个自定义类(我们称之为NoticeSubView),那么您可以按照以下方式找到它:
for view in self.view.subviews {
    if let noticeSubView = view as? NoticeSubView {
        // Subview exists
    }
}

或者,您可以给视图分配一个标签并搜索它。
noticeSubView.tag = 99
//...

for view in self.view.subviews {
    if view.tag == 99 {
        // Subview exists
    }
}

谢谢你,我喜欢使用自定义类 "for view in self." 的想法......我会在另一个控制器中需要这种方法。 - john tully

-1

查找视图是否存在的最佳且简单的方法是,有许多方法,例如您可以检查超级视图中是否包含视图或者只是查看一些时间,但有时此方法会失败,因为如果Uiview已被删除,则会出现错误,因此代码在这里:这里errorView是我的UiView

 errorView.tag = 333

 if ( self.view?.viewWithTag(333) != nil ){
    print("contain")
 }

 else {
    print("not contain")
 }

这有什么不同于被接受答案的后半部分呢? - John Montgomery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接