【问题标题】:UIView: How to find out if a view is already exists?UIView:如何找出一个视图是否已经存在?
【发布时间】:2011-07-27 01:37:42
【问题描述】:

我想知道如何确定子视图(在我的情况下为 pageShadowView)是否已添加到我的视图中。

我想出了这个,但它并没有真正起作用:

if ([pageShadowView isKindOfClass:[self.view class]]) {
        [self.view addSubview:pageShadowView];
    }

另外,我仍然对 self.-thing 感到困惑。我知道这与明确我们正在谈论当前 ViewController 的视图有关......但是如果 (1) 没有其他 ViewController 或 (2) 如果它并不重要,我真的需要它吗?因为如果我想引用另一个 viewController,我一定要调用它?

很抱歉,如果这一切都是非常基本的,但我会非常感谢您的 cmets。

【问题讨论】:

    标签: iphone objective-c cocoa-touch uiview


    【解决方案1】:

    这里:

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

    是的,你需要这个selfUIViewController 上没有明确的 ivar“视图”。 self.view 语句实际上是对 [self view] 方法的调用,它是 UIViewController 视图的 getter。

    【讨论】:

    • 非常感谢。我试着把它缩写一点,但没有让它起作用。我尝试了if ([self.view.subviews containsObject:pageShadowView]=! TRUE) {[self.view addSubview:pageShadowView];},但我只收到错误“需要左值作为赋值的左操作数”。抱歉,我还是个初学者,我猜我弄错了一些非常基本的东西。
    • 在 Objective-C 中,有 YES 和 NO。您可以完全跳过 'true' 测试: if ( ! [self.view.subviews containsObject:pageShadowView]) {[self.view addSubview:pageShadowView];}
    • "UIViewController 上没有明确的 ivar "view" > 这并不完全正确。有一个 ivar UIView *_view,但我们(第三方开发者)无法访问它,因为它位于 @package 部分。
    • 感谢@BartoszCiechanowski,如果是窗口,我认为它是失败的,还有其他处理相同的选项吗?
    【解决方案2】:

    给它一个唯一的标签:view.tag = UNIQUE_TAG,然后检查容器视图是否存在:

    BOOL alreadyAdded = [containerView viewWithTag:UNIQUE_TAG] != nil;
    

    【讨论】:

    • 谢谢。我正在检查是否已将异步图像视图添加到自定义集合视图单元格中,并且此检查工作正常!
    【解决方案3】:

    你可以找到这样的子视图

    for(UIView *view in self.view.subviews)
    {
        if([view isKindOfClass:[UIView class]])
        {
            //here do your work
        }
    }
    

    【讨论】:

      【解决方案4】:

      添加视图的保留值

      然后检查保留值

      如果 > 1 ,则存在,如果完美应该是 2

      然后释放一次

      【讨论】:

        【解决方案5】:

        还有另一种查找方法,在 Swift 中:isDescendant(of view: UIView) -> Bool 或在 Obj-C 中:- (BOOL)isDescendantOfView:(UIView *)view

        斯威夫特

            if myView.isDescendant(of: self.view) {
                //myView is subview of self.view, remove it.
                myView.removeFromSuperview()
            } else {
                //myView is not subview of self.view, add it.
                self.view.addSubview(myView)
            }
        

        Obj-C

        if([myView isDescendantOfView:self.view]) {   
            //myView is subview of self.view, remove it.
            [myView removeFromSuperView];
        } else {
            //myView is not subview of self.view, add it.
            [self.view addSubView:myView];
        }
        

        【讨论】:

          【解决方案6】:

          要补充 coneybeare 所说的内容,您可以执行以下操作。如果你设置你的 object.tag=100;

                     if ([self.view.superview viewWithTag:100] == nil){ //if statement executes if the object with tag 100 in view.superview is absent (nil)
          
                     if ([self.view viewWithTag:100] == nil){ //if statement executes if the object with tag 100 in view (not superview) is absent (nil)
          

          【讨论】:

            【解决方案7】:

            快捷版:

            let doesContain = self.view?.subviews.contains(pageShadowView)
            

            【讨论】:

              【解决方案8】:

              找到您的视图是否存在的最佳和简单的方法,有很多方法,例如您检查视图是否包含在超级视图中,或者只是查看某个时间此方法失败,因为如果 Uiview 已经被删除,那么发生错误, 所以代码在这里: 这里的errorView是我的UiView

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

              【讨论】:

                猜你喜欢
                • 2019-06-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-04-17
                相关资源
                最近更新 更多