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

6

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

这是我的代码。它成功地从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 - tia
self.contentView是继承而来的,它不是来自nib文件。 - Gary Kagan
1
在这个旧问题上,“这里唯一正确的答案”是MidhunMP的答案。其余的都明显是错误/危险的。 - Fattie
7个回答

7
你的代码问题在于,当你调用 removeFromSuperview 方法时,父视图会将该视图释放。不需要调用 removeFromSuperview 方法,只需将其添加为另一个视图的子视图即可将其从当前的父视图中移除。

因此,请使用以下代码:

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

根据UIView类参考

addSubview:

Adds a view to the end of the receiver’s list of subviews.

- (void)addSubview:(UIView *)view

Parameters

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. 

Discussion

This method retains view and sets its next responder to the receiver, which is its new superview.

Views can have only one superview. If view already has a superview and that view is not the receiver, this method removes the previous superview before making the receiver its new superview.


1

当你将视图从superView中移除时,它会从memory中释放。所以在你的情况下,你需要这样做:

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

0

您可以将指定的视图设置为属性,或者在将其从父视图中移除之前将其添加到内容视图中。我不确定当您移除视图时,如果视图的保留计数减少到0,它是否会调用父视图来释放它。


我从父视图中删除了该视图,但其保留计数仍为1。 - Gary Kagan

0
  for (UIView *v in innerMainView.subviews)
    {
        [v removeFromSuperview];
    }   
    [innerMainView addSubview:StandardView];

-1

我不确定这是否有效,但尝试交换[view removeFromSuperview];[self.contentView addSubview:view];。这是因为根据UIView类参考文档removeFromSuperview会导致父视图释放该视图。

希望能有所帮助!


1
我建议使用以下代码替代: [view retain]; [view removeFromSuperview]; [self.contentView addSubview:view]; [view release]; 因为当视图有两个父视图时,调用removeFromSuperview可能会导致奇怪的结果。 - Chance Hudson
你可能是对的。实际上,在类参考中也有类似的说法。谢谢。 - pasawaya
1
不妨将删除操作注释掉,试试看。将视图添加到新的父视图会覆盖superview属性。但很可能问题是因为新的父视图要么为空,要么由于其他原因被隐藏了。 - danh
无论是调用retain还是交换语句的顺序都没有任何影响。新的父级视图肯定不是nil,而且它是可见的。 - Gary Kagan

-1

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


-1

contentView 不属于 UIView 的属性,而属于 UITableViewCell 的属性。它返回单元格对象的内容视图。


这不是我创建的UITableViewCell,我自己创建了contentView,它没有继承。 - Gary Kagan

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