一个简单的 insertSubview 案例:belowSubview 不起作用

Posted

技术标签:

【中文标题】一个简单的 insertSubview 案例:belowSubview 不起作用【英文标题】:a simple case of insertSubview:belowSubview doesnt work 【发布时间】:2011-07-26 23:28:11 【问题描述】:

我查看了许多这种方法的示例,但仍然无法弄清楚我正在做的事情有什么问题。我正在尝试在当前视图下方添加另一个视图,然后在用户单击当前屏幕上的按钮后删除当前视图。由于某种原因,视图消失了,但我看不到应该在它下面的视图。我只是得到一个白屏。

这是我当前视图的 ViewDidLoad(在顶部的视图 - ViewControllerTop 就示例而言):

- (void)viewDidLoad

[super viewDidLoad];
viewControllerBottom = [[ViewControllerBottom alloc] init];
[self.view insertSubview:viewControllerBottom.view belowSubview:self.view];


按照这个方法,还有一个方法,一旦用户点击按钮就会触发:

- (IBAction)goToBottomView:(id)sender  
[self.view.superview removeFromSuperview];


有人认为这有什么问题吗?谢谢您的帮助!

顺便说一句 - 即使它很傻,我也尝试使用 insertSubview:aboveSubview 但它也不起作用。

【问题讨论】:

尝试 NSLogging 您尝试添加到视图中的对象。我最近遇到了一个问题,有些东西不会出现,我 NSLogged 它,它的值为(null),我没有正确初始化它 【参考方案1】:

我认为您的代码存在根本性错误。你正在做:

[self.view insertSubview:viewControllerBottom.view belowSubview:self.view]

所以你传入belowSubview:参数的视图需要是self.view的子视图,self.view不是!

如果您按预期将insertSubview:belowSubview: 与接收器对象的子视图一起使用,它将正常工作。

【讨论】:

+1 谢谢,pgb。我应该如何将它与子视图一起使用?我应该先将其添加为子视图,然后将其插入下面吗?谢谢。 是的,您需要插入子视图并按照您希望它们出现在屏幕上的顺序重新排列它们。 我这样做了,但没有用...有什么想法吗? [self.view addSubview:myLoginVC.view]; [self.view.superview insertSubview:myLoginVC.view belowSubview:self.view]; 您再次混合视图层次结构...您将myLoginVC.view 作为self.view 的子视图,因此您也不能交换它们。【参考方案2】:

上述代码中的另一个根本错误是这个新视图没有定义框架。您应该使用适当的框架,而不是调用将视图初始化为空矩形的 init。像 self.frame 这样的东西应该可以覆盖整个视图。

顺便说一句,您不能同时执行 addSubview 然后调用 insertSubView。查看您想要实现的目标,您应该将这个新视图插入到父级。

viewControllerBottom = [[ViewControllerBottom alloc] initWithFrame:self.frame];
[self.view.superView insertSubview:viewControllerBottom.view belowSubview:self.view];

【讨论】:

以上是关于一个简单的 insertSubview 案例:belowSubview 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥尽管使用了 `insertSubview:belowSubview:` 我的视图仍然出现在另一个视图之上?

insertSubview:AtIndex:不起作用

UITableViewCell addSubview 与 insertSubview:atIndex:

self.view.insertSubview 背景图像数组不前进

UIView类中addSubview和insertSubview之间的区别

insertSubView:belowSubview: 用于 UIImageView