我敢肯定,这是一个简单的问题,但现在已经使我逃脱了一段时间。
说我有一个UIViewController,它定义为XIB或堆栈中的根。在我的代码中的某个时候,我想用另一个视图控制器替换它。只需将其更换即可。我该怎么做?
我曾尝试定义控制器并进行分配,但不确定在没有导航控制器的情况下将其实际推入屏幕的原因。
最佳答案
我认为当您说要替换视图控制器时,实际上是要替换视图。请记住,视图控制器不是可见的,但是每个视图控制器都映射到一个视图,可以通过将其添加为可见视图的子视图来使其变得可见。
您用新的视图控制器的视图替换self.view的解决方案可能在您的特定情况下可行,但可能不是您问题的“正确”答案。在某些情况下,该解决方案将无法为您服务。
假设您有一个简单的基于视图的应用程序,没有导航控制器,也没有标签栏控制器。在您的应用程序委托中,您构造一个YourFirstViewController的实例,然后调用[window addSubview:yourFirstController];。现在,视图层次结构由一个UIWindow组成,该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。
关于iphone - 是什么导致UIViewController变为事件状态?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2498112/