Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UIView:如何确定视图是否已经存在?_Iphone_Objective C_Cocoa Touch_Uiview - Fatal编程技术网

Iphone UIView:如何确定视图是否已经存在?

Iphone UIView:如何确定视图是否已经存在?,iphone,objective-c,cocoa-touch,uiview,Iphone,Objective C,Cocoa Touch,Uiview,我想知道如何找出子视图(在我的例子中是pageShadowView)是否已经添加到我的视图中 我想到了这个,但它实际上不起作用: if ([pageShadowView isKindOfClass:[self.view class]]) { [self.view addSubview:pageShadowView]; } 还有,我仍然对自我感到困惑-这件事。我知道这与明确我们讨论的是当前ViewController的视图有关。。。但是,如果(1)没有其他viewCont

我想知道如何找出子视图(在我的例子中是pageShadowView)是否已经添加到我的视图中

我想到了这个,但它实际上不起作用:

if ([pageShadowView isKindOfClass:[self.view class]]) {
        [self.view addSubview:pageShadowView];
    }
还有,我仍然对自我感到困惑-这件事。我知道这与明确我们讨论的是当前ViewController的视图有关。。。但是,如果(1)没有其他viewController,或者(2)如果它真的不重要,因为如果我想引用另一个viewController,我会确保调用它,那么我真的需要它吗

如果这些都是非常基本的,我很抱歉,但我非常感谢您的评论。

这里:

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

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

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

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

您可以找到这样的子视图

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

添加视图的保留值

然后检查保留值

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


然后释放它一次

Swift中还有一种方法可以找到:
isDescendant(视图:UIView)->Bool
或在Obj-C中:
-(Bool)isdescendatoview:(UIView*)视图

Swift

    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)
    }
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];
}
Obj-C

    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)
    }
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];
}

为了补充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)
SWIFT版本:

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

查找视图是否存在的最佳且简单的方法,有很多种方法,例如检查视图是否包含在超级视图中,或者在某个时间查看此方法失败,因为如果Uiview已被删除,则会发生错误, 代码如下: 这是我的观点

 errorView.tag = 333

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

 else {
    print("not contain")
 }

谢谢。我试着把它缩写一点,但没法用。我尝试了
如果([self.view.subviews containsObject:pageShadowView]=!TRUE){[self.view addSubview:pageShadowView];}
但是我只得到了错误“左值必须作为赋值的左操作数”。对不起,我还是一个初学者,我猜我有一些基本的错误。在Objective-C中,有是和否。你可以完全跳过“真”测试:如果(![self.view.subviews containsObject:pageShadowView]){[self.view addSubview:pageShadowView];}“UIViewController上没有显式ivar“view”>这不是完全正确的。有一个ivar
UIView*\u view
,但我们(第三方开发者)无法访问它,因为它位于@package部分。谢谢@BartoszCiechanowski,如果是窗口,我认为它是失败的,还有其他选项可以处理吗?谢谢。我正在检查是否已将异步图像视图添加到自定义集合视图单元格中,并且此检查非常有效!