我确信这是一个简单的问题,但现在已经逃脱了一段时间了。
假设我有一个UIViewController,或者定义为XIB中的根或堆栈。在我的代码中的某些时候,我想用另一个视图控制器替换它。只需将它取出即可。我该怎么做?
我尝试过定义控制器和分配,但不确定在没有导航控制器的情况下实际上是什么让它在屏幕上推动。
答案 0 :(得分:1)
我想当你说要替换视图控制器时,你的意思是你要替换视图。请记住,视图控制器不可见,但每个视图控制器都映射到视图,通过添加为可见视图的子视图,视图可以显示。
使用新视图控制器的视图替换self.view的解决方案可能适用于您的特定情况,但它可能不是您问题的“正确”答案。可能会出现这种解决方案不适合您的情况。
假设您有一个基于视图的简单应用程序,没有导航控制器,也没有标签栏控制器。在你的app委托中,你构造了一个YourFirstViewController实例,并调用[window addSubview:yourFirstController] ;.您的视图层次结构现在包含一个带有单个子视图的UIWindow - YourFirstViewController的视图。
现在让我们假设用户按下该视图上的按钮,该按钮由YourFirstViewController中定义的IBAction处理。您希望通过使用与YourSecondViewController关联的视图“替换”YourFirstViewController的视图来做出响应。我在引号中添加“替换”因为我们通常通过将其视图控制器推送到导航堆栈来呈现视图,或者调用presentModalViewController:animated:以模态方式呈现视图,但我们假设您出于某种原因拒绝了这些选项,而你实际上确实希望用YourSecondViewController的视图手动替换YourFirstViewController的视图。
这是操纵视图层次结构的简单问题。您想要从其超级视图(在本例中为UIWindow)中删除YourFirstViewController的视图,并且您希望将YourSecondViewController的视图添加为子视图以替换它。因此,您的行为将如下所示:
- (IBAction)replaceButtonClicked {
UIView *mySuperview = self.view.superview;
YourSecondViewController *secondController = [[YourSecondViewController alloc] init];
[mySuperview addSubview:secondController.view];
[self.view removeFromSuperview];
[secondController release];
}
当我们使用-pushViewController:animated:或-presentModalViewController等方法时,接收控制器会为我们操纵视图层次结构。这可能会让我们看到屏幕上的视图控制器,但我们不是。我们只是查看嵌套视图的大型层次结构,一直到顶部的UIWindow。
答案 1 :(得分:0)
您可以展示新的视图控制器modally:
[self presentModalViewController:aViewController animated:YES];
这不会直接替换当前的VC,但会显示当前视图的新视图。