从一个视图中删除一个视图并将其添加到另一个视图

Posted

技术标签:

【中文标题】从一个视图中删除一个视图并将其添加到另一个视图【英文标题】:Remove a view from one view and add it to another 【发布时间】:2012-06-15 03:24:31 【问题描述】:

我正在尝试查找 nib 中的所有视图并将它们添加到我的内容视图中。

这就是我所拥有的,它成功地从 self.view 中删除了视图,但它没有将它添加到 self.contentView

for (UIView *view in self.view.subviews) 
    if (view.tag != 666) 
        [view removeFromSuperview];
        [self.contentView addSubview:view];
    

任何帮助将不胜感激。

【问题讨论】:

您是否检查过 self.contentView 链接到 nib 而不是 nil self.contentView 被继承。它并非源自笔尖。 关于这个老问题,这里唯一正确的答案是 MidhunMP 的答案。其余的都非常错误/危险。 【参考方案1】:

代码中的问题是,当您调用removeFromSuperview 时,视图将被父视图释放。无需调用removeFromSuperview,只需将其添加为另一个视图的子视图即可将其从当前父视图中移除。

所以使用:

for (UIView *view in self.view.subviews)

    if (view.tag != 666)
    
        [self.contentView addSubview:view];
    

根据UIView Class Reference:

添加子视图

在接收者的子视图列表的末尾添加一个视图。

- (void)addSubview:(UIView *)view

参数

查看

The view to be added. This view is retained by the receiver. After being added, this view appears on top of any other subviews. 

讨论

此方法保留视图并将其下一个响应者设置为接收者, 这是它的新superview。

视图只能有一个超级视图。如果视图已经有一个超级视图并且 那个view不是receiver,这个方法去掉了之前的 将接收器设置为新的超级视图之前的超级视图

【讨论】:

【参考方案2】:

当您从superView 中删除您的视图时,它会从memory 中删除release。所以在你的情况下,你需要这样做:

UINib *infoNib = [UINib nibWithNibName:@"YourXIBFileName" bundle:nil];

NSArray *topLevelObjects = [infoNib instantiateWithOwner:self options:nil];

UIView *infoView = [topLevelObjects objectAtIndex:0];
for (UIView *view in infoView.subviews) 
        [self.contentView addSubview:view];
    

【讨论】:

【参考方案3】:
  for (UIView *v in innerMainView.subviews)
    
        [v removeFromSuperview];
       
    [innerMainView addSubview:StandardView];

【讨论】:

【参考方案4】:

您可以将指定的视图设置为属性,也可以将视图添加到内容视图中,然后再将其从超级视图中删除。我不确定当你删除视图时,如果视图的保留计数减少到 0,它会调用超级视图来释放它。

【讨论】:

从 superView 中删除后,保留计数仍为 1。【参考方案5】:

我不确定这是否可行,但请尝试切换[view removeFromSuperview];[self.contentView addSubview:view];。这是因为根据UIView Class Reference,removeFromSuperview导致superview释放视图。

希望这会有所帮助!

【讨论】:

我建议不要这样做[查看保留]; [查看 removeFromSuperview]; [self.contentView addSubview:view]; [查看发布];仅仅因为当视图有 2 个超级视图时调用 removeFromSuperview 可能会奇怪地结束 你可能是对的。事实上,它在类参考中说了类似的话。谢谢 两者都不是,不如只注释掉删除。添加到新的超级视图会覆盖超级视图属性。但问题很可能是因为新的父节点要么是 nil,要么是由于其他原因而隐藏。 无论是调用retain还是切换语句的顺序都没有任何效果。新的父母绝对不是零,它是可见的。【参考方案6】:

检查错误。 您最好打印这些视图的框架(self.view、self.contentView)。 并使它们具有不同的颜色。 然后你可以看到错误。 祝你好运!

【讨论】:

【参考方案7】:

contentView 不属于UIVew 的财产。它属于UITableViewCell 的财产。它返回单元格对象的内容视图。

【讨论】:

这不是 UITableViewCell 我自己创建的 contentView 它没有被继承。

以上是关于从一个视图中删除一个视图并将其添加到另一个视图的主要内容,如果未能解决你的问题,请参考以下文章

将数据从列表视图(从 Rest Api 生成)传递到另一个活动并将其保存到 SQLite 数据库中

IOS - 从表视图控制器获取值并将其发送到另一个表视图控制器

以编程方式从其父视图中删除子视图并将其附加到其他父视图

如果您从一个视图控制器快速移动到另一个视图控制器,如何动态地将值添加到数组中?

将 JSON 字符串从一个视图传递到另一个视图

如何轻松地将变量从一个视图传递到另一个视图?